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规则可以设计成如下形式

url(r‘^category/(?P<cat_name>\w+)/$‘, ‘category‘, name=‘list_category‘),

这样category的名字会被当做参数传递给category这个view.同时给这条url规则命名为list_category.

模板文件中,生成导航条的代码如下

    <nav id="site-nav">
        {% for name in cat_all %}
            <a name="{{ name }}" href="{% url ‘list_category‘ name %}"
               class="{% if name == cat_now %}active{% endif %}">{{ name|capfirst }}</a>
        {% endfor %}
    </nav>


如果文章列表需要分页,可以再添加一个url规则

url(r‘^category/(?P<cat_name>\w+)/page/(?P<page_num>\d+)/$‘, ‘category‘, name=‘page‘)

分页显示的模板代码

        {% if posts.object_list and posts.paginator.num_pages > 1 %}
            <footer>
                {% if posts.has_previous %}
                    <a href="{% url ‘page‘ cat_now posts.previous_page_number %}"><</a>
                {% endif %}
                <span>
                    {{ posts.number }} of {{ posts.paginator.num_pages }}
                </span>
                {% if posts.has_next %}
                    <a href="{% url ‘page‘ cat_now posts.next_page_number %}">></a>
                {% endif %}
            </footer>
        {% endif %}


最后是view的代码

from django.shortcuts import render
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from blog.models import Post, Category

def category(request, cat_name, page_num=1):
    if cat_name.lower() == ‘home‘:
        posts = Post.objects.all().order_by(‘-date‘)
    else:
        posts = Post.objects.all().filter(category__name=cat_name).order_by(‘-date‘)

    paginator = Paginator(posts, 3)
    try:
        page = int(page_num)
    except ValueError:
        page = 1

    try:
        posts = paginator.page(page)
    except (InvalidPage, EmptyPage):
        posts = paginator.page(paginator.num_pages)

    return render(request, ‘blog/index.html‘,
                  {
                      ‘posts‘: posts,
                      ‘cat_now‘: cat_name,
                      ‘cat_all‘: map(lambda cat: cat.name, Category.objects.all())
                  })

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

时间: 2024-12-23 12:51:55

Django中url的逆向解析 -> Reverse resolution of URLs的相关文章

django中url路由配置及渲染方式

今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 创建视图并访问 项目中自带的Python文件中,并没有带有视图,因此我们自己创建一个,通常,我们把视图命名views.py. 然后在views.py中,导入头文件  from django.http import HttpResponse 然后我们在views.py中,写一些Python函数,用来

django 中url与path小记

1. 在django 2.0中增加了一些新的特性 更简单的URL路由语法 (Simplified URL routing syntax) admin应用的针对移动设备的优化改进(Mobile-friendly contrib.admin) 支持SQL开窗表达式(Window expressions) 第一个特性,主要用于动态路由定义上.在Django2.0代码实现中,主要的变化是新增了 django.urls.path 函数,它允许使用一种更加简洁.可读的路由语法.比如之前的版本的代码:在dja

Django中url使用命名空间的错误

出的错误: 1. Reverse for 'llist' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 2. Reverse for 'home' with arguments '(1L,)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'org/home/?P<org_id>(/d+)/$'] 出错原因

django中url,静态文件,POST请求的配置

平时使用的是pycharm,所以这篇文章主要也是使用pycharm默认创建的django项目为基础进行讲解.项目目录如下图: 1.URL的配置 当创建好项目后,运行项目就可以看到django默认的页面.那么怎么访问自己创建的页面呢? 因为django是类MVC的开发模式.这里面就涉及到配置URL的问题.创建一个自己的APP(也可以称为一个模块),包含的文件内容如下图: 然后需要在setting.py的文件INSTALLED_APPS中注册新创建的App: 新创建项目的默认url配置如下: fro

Python - Django - 命名 URL 和反向解析 URL

命名 URL: test.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试页面</title> </head> <body> <p>测试页面</p> <form action="/test/" method=&quo

django中“url映射规则”和“服务端响应顺序”

1.django搜索路径 使用 import 语句时,Python 所查找的系统目录清单. 查看方式: import sys print sys.path 通常无需关心 Python 搜索路径的设置,Python 和 Django 会在后台自动帮你处理好. 2.url匹配模式  基本结构: '^需要匹配的url字符串$' PS:实际上最终完整的url串是http://根路径:端口号/需要匹配的url字符串 系统自动添加的部分'http://根路径:端口号/' eg:url匹配模式:'^lates

Django中url中可以使用类视图.as_view()进行映射的原因

说明:本人在学练习天天生鲜项目时,对利用类视图去与正则匹配到的url做映射有点疑惑,经过查看他人博客以及自我分析算是整明白了,所以记录一下 参考:https://www.zmrenwu.com/post/53/ HTTP发送请求的方式有很多种,这里以POST,GET为例.当在浏览器中输入url地址时(如http://127.0.0.1:8000/userr/register) 会进行正则匹配,并映射到ActiveView.as_view(),其最终达到能将注册页面显示出来的效果,原因如下: cl

Django的url用法

利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰,比较容易维护. 最简单的形式 from django.conf.urls import patterns, url urlpatterns = patterns('', url(r'^articles/2003/$', 'news.views.special_case_2003'), url(r'^articles/(\d{4})/$', 'news.view

python之路_day107_django中url反向解析及数据库连接

一.url反向解析 在正式介绍反向解析之前,我们首先介绍一下在django中的url参数,如下为我们url实例,其中name参数就是其别名,也就是我们接下来讲解的反向解析中所依靠的参数. 1.模板中反向解析 在我们的前端页面上,如form表单,我们通常会指定提交的路径,但是以往我们都是将路径写死,这显然不是很合理,因为当url中的路径需要改变的时候,我们又需要逐一去更改页面.这样不合理.所以我们就要用到url的别名进行反向解析. 语法: {% url 'url的别名' %} 实例如下: 2.视图