web服务器

路由反向解析

2018-09-30  本文已影响32人  GHope

在实际的Django项目中,经常需要获取某条URL,为生成的内容配置URL链接。
比如,我要在页面上展示一列文章列表,每个条目都是个超级链接,点击就进入该文章的详细页面。
现在我们的urlconf是这么配置的:^post/(?P<id>\d+)
在前端中,这就需要为HTML的<a>标签的href属性提供一个诸如http://www.xxx.com/post/3的值。其中的域名部分,Django会帮你自动添加无须关心,我们关注的是post/3
此时,一定不能硬编码URL为post/3,那样费时、不可伸缩,而且容易出错。试想,如果哪天,因为某种原因,需要将urlconf中的正则改成^entry/(?P<id>\d+),为了让链接正常工作,必须修改对应的herf属性值,于是你去项目里将所有的post/3都改成entry/3吗?显然这是不行的!
我们需要一种安全、可靠、自适应的机制,当修改URLconf中的代码后,无需在项目源码中大范围搜索、替换失效的硬编码URL。
为了解决这个问题,Django提供了一种解决方案,只需在URL中提供一个name参数,并赋值一个你自定义的、好记的、直观的字符串。
通过这个name参数,可以反向解析URL、反向URL匹配、反向URL查询或者简单的URL反查。

在需要解析URL的地方,对于不同层级,Django提供了不同的工具用于URL反查:
a)在模板语言中:使用url模板标签。(也就是写前端网页时)
b)在Python代码中:使用reverse()函数。(也就是写视图函数等情况时)
c)在更高层的与处理Django模型实例相关的代码中:使用get_absolute_url()方法。(也就是在模型model中)

综合应用:

项目目录命名空间

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 127.0.0.1:8000/app/stu
    url(r'app/', include('app.urls', namespace='app')),
    url(r'users/', include('users.urls', namespace='users')),
]

应用层中命名路由

from django.conf.urls import url

from app import views

urlpatterns = [
    url(r'^stu/', views.index, name='index'),
    # url(r'^del_stu/(\d+)/', views.del_stu, name='del_stu'),
    url(r'^del_stu/(?P<s_id>\d+)/', views.del_stu, name='del_stu'),
    url(r'^sel_stu/(?P<s_id>\d+)/', views.sel_stu, name='sel_stu'),

]

视图函数中的引用

def del_stu(request, s_id):
    if request.method == 'GET':
        # 删除方法
        # 获取url中的id值
        # id = request.GET.get('id')
        # 获取学生对象
        stu = Student.objects.get(pk=s_id)
        # 删除对象
        stu.delete()
        return HttpResponseRedirect(reverse('app:index'))

前端页面中的引用


{%  extends 'base_main.html' %}

{%  block title %}
    学生列表页面
{%  endblock %}

{% block extJs %}
    {{  block.super }}
    <script src="/static/js/xxx.js"></script>
{% endblock %}

{%  block content %}
    <table>
        <thead>
        <th>序号</th>
        <th>id</th>
        <th>name</th>
        <th>age</th>
        <th>时间</th>
        <th>操作</th>
        </thead>
        <tbody>
        {% for stu in students %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ stu.id}}</td>
            <td >{{ stu.s_name|upper}}</td>
            <td >{{ stu.s_age|add:10}}</td>
            <td >{{ stu.create_time|date:'Y-m-m H:i:s'}}</td>
            <td >
                <!--<a href="/app/del_stu/?id={{ stu.id }}">删除</a>-->
                <a href="{% url 'app:del_stu' stu.id %}">删除</a>
                |
                <a href="{% url 'app:sel_stu' stu.id %}}">查看</a>
            </td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
{%  endblock %}
上一篇 下一篇

猜你喜欢

热点阅读