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方法是路由分发方法    
] 
View Code

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'),
]
View Code

通过对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>
View Code

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'),
]
View Code

对应的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>
View Code

 

为了减少代码的重复造轮子,通过动态的生成URL,使得代码更加整洁,以后代码维护也更加方便,也方便别人合作。

posted @ 2017-07-19 11:28  如缕清风  阅读(129)  评论(0)    收藏  举报