美文网首页web服务器
路由反向解析

路由反向解析

作者: GHope | 来源:发表于2018-09-30 16:58 被阅读32次

    在实际的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 %}
    

    相关文章

      网友评论

        本文标题:路由反向解析

        本文链接:https://www.haomeiwen.com/subject/amxggftx.html