Django动态URL及命名空间
Django生成动态的URL链接以及命名空间,开始学的时候,比较困惑,迷迷糊糊了一段时间,弄明白后,发现真的不是那么难,只是我弄复杂了。
比如:(这个是一个Django的工程目录)
django_project/ app_name/ migrations/ __init__.py admin.py apps.py models.py tests.py urls.py views.py static/ django_project/ __init__.py settings.py urls.py wsgi.py templates/ db.sqlite3 manage.py
1.Django路由系统的URL的name属性
通常urls.py文件会在django的工程目录下有一个,在每个app里也会创建一个。虽然在django_project的urls.py可以完成所有的URL配置,但是这样不易保持工程代码的整洁性,也不利于以后的代码维护。
不用name属性命名,也可以完成URL的匹配,但是这有一个显而易见的缺点,如果改动匹配URL链接,那么就需要改动所有的templates的url链接的代码,这样就会重复代码的修改,浪费大量的时间,当然如果你不觉得麻烦,你一样不需要使用name属性。总的来说,利用name属性生成url是一个很棒的选择。
django_project的urls.py代码:
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app_name/', include('app_name.urls')), #include方法是路由分发方法 ]
app_name的urls.py代码:
from django.conf.urls import url from app_name import views urlpatterns = [ url(r'^index/', views.index, name='index'), url(r'^page/[\d]+', views.page, name='page'), ]
通过对url添加name属性,则相应在templates的HTML模板中修改超链接的值:
{#1.url(r'^index/', views.index, name='index')#} {#这种由于没有在URL中传递参数,则不需要添加模板的参数#} <a href="{% url 'app_name:index' %}">Index</a> {#2.url(r'^page/[\d]+', views.page, name='page')#} {#这种由于匹配的链接中添加了参数,则需要添加模板中的参数加以匹配#} <a href="{% url 'app_name:page' 5 %}">Page</a> <form id="page_form" method="post" action="{% url 'app_name:page' 7 %}"></form> {#如果传递的数据是从数据库中取出,比如nid的编号,则进行修改page/[\d]+为:page/(?P<nid>[\d]+)/#} <a href="{% url 'app_name:page' model.nid %}">Page</a> <form id="page_form" method="post" action="{% url 'app_name:page' model.nid %}"></form>
2.命名空间
通过命名空间的方法,则可以是多个app更加整洁,比如由于很多app,很有可能使用了相同的url匹配,则会造成匹配冲突。添加命名空间,则指定匹配对应的app的url。
代码如下:(app_name下的urls.py文件)
from django.conf.urls import url from app_name import views app_name = 'app_name' #添加app_name属性等于app的名称 urlpatterns = [ url(r'^index/', views.index, name='index'), url(r'^page/(?P<nid>[\d]+)', views.page, name='page'), ]
对应的templates模板的HTML写法:
<a href="{% url 'app_name:index' %}">Index</a> <a href="{% url 'app_name:page' model.nid %}">Page</a> #model为从数据库中取出来的数据 <form id="page_form" method="post" action="{% url 'app_name:page' model.nid %}"></form>
为了减少代码的重复造轮子,通过动态的生成URL,使得代码更加整洁,以后代码维护也更加方便,也方便别人合作。

浙公网安备 33010602011771号