在实际的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 %}
网友评论