• Django中url的逆向解析 -> Reverse resolution of URLs


    之前的一篇文章中介绍了url的基本用法[Django的url用法
    解析的过程可以概括为URL request -> view calling
    同时,django又提供了另一种解析方式 - Reverse resolution of URLs
    它的解析过程为 view calling -> URL request

    因为Django奉行的是DRY原则,所以使用这种方式,就无需对url地址进行硬编码.在原本需要硬编码url的地方,直接可以使用url的名字,然后逆向解析出url地址.
    Django提供了不同层面上的url解析方法.
    • template文件: 用url模板标签
    • python代码中可以使用django.core.urlresolvers.reverse()
    • 其他get_absolute_url()

    以一个简单的博客url规则来举例说明,导航页面如下
    导航条的category都是从数据库读出的数据,其中每个category都是形如/blog/category/category_name的超链接,具体如下
    • /blog/category/home/
    • /blog/category/python/
    • /blog/category/android/
    • /blog/category/reading/
    因此我们的url规则可以设计成如下形式
    [python] view plain copy
     
    1. url(r'^category/(?P<cat_name>w+)/$', 'category', name='list_category'),  
    这样category的名字会被当做参数传递给category这个view.同时给这条url规则命名为list_category.
    模板文件中,生成导航条的代码如下
    [html] view plain copy
     
    1. <nav id="site-nav">  
    2.     {% for name in cat_all %}  
    3.         <name="{{ name }}" href="{% url 'list_category' name %}"  
    4.            class="{% if name == cat_now %}active{% endif %}">{{ name|capfirst }}</a>  
    5.     {% endfor %}  
    6. </nav>  

    如果文章列表需要分页,可以再添加一个url规则
    [python] view plain copy
     
    1. url(r'^category/(?P<cat_name>w+)/page/(?P<page_num>d+)/$', 'category', name='page')  
    分页显示的模板代码
    [html] view plain copy
     
    1. {% if posts.object_list and posts.paginator.num_pages > 1 %}  
    2.     <footer>  
    3.         {% if posts.has_previous %}  
    4.             <href="{% url 'page' cat_now posts.previous_page_number %}"><</a>  
    5.         {% endif %}  
    6.         <span>  
    7.             {{ posts.number }} of {{ posts.paginator.num_pages }}  
    8.         </span>  
    9.         {% if posts.has_next %}  
    10.             <href="{% url 'page' cat_now posts.next_page_number %}">></a>  
    11.         {% endif %}  
    12.     </footer>  
    13. {% endif %}  

    最后是view的代码
    [html] view plain copy
     
    1. from django.shortcuts import render  
    2. from django.core.paginator import Paginator, InvalidPage, EmptyPage  
    3. from blog.models import Post, Category  
    4.   
    5.   
    6. def category(request, cat_name, page_num=1):  
    7.     if cat_name.lower() == 'home':  
    8.         posts = Post.objects.all().order_by('-date')  
    9.     else:  
    10.         posts = Post.objects.all().filter(category__name=cat_name).order_by('-date')  
    11.   
    12.     paginator = Paginator(posts, 3)  
    13.     try:  
    14.         page = int(page_num)  
    15.     except ValueError:  
    16.         page = 1  
    17.   
    18.     try:  
    19.         posts = paginator.page(page)  
    20.     except (InvalidPage, EmptyPage):  
    21.         posts = paginator.page(paginator.num_pages)  
    22.   
    23.     return render(request, 'blog/index.html',  
    24.                   {  
    25.                       'posts': posts,  
    26.                       'cat_now': cat_name,  
    27.                       'cat_all': map(lambda cat: cat.name, Category.objects.all())  
    28.                   })  


  • 相关阅读:
    在安装了Anaconda+Pycharm怎么导入OpenCV
    JS--ECMAScript
    JS--DOM
    JS-BOM
    浮动 高度塌陷
    CSS2--字体样式
    CSS2--文本样式
    css2--垂直对齐
    css2--背景
    HTML基础
  • 原文地址:https://www.cnblogs.com/zhangxiaomeng1991/p/8251373.html
Copyright © 2020-2023  润新知