接着昨天关于include在Django1和2中的使用区别说,昨天介绍了Django1的使用,以及Django2的基本输入,今天就接着昨天详细说一下Django2的include发放问题。
先回顾一下昨天的基本使用
# In settings/urls/main.py from django.urls import include, path urlpatterns = [ path('<username>/blog/', include('foo.urls.blog')), ] # In foo/urls/blog.py from django.urls import path from . import views urlpatterns = [ path('', views.blog.index), path('archive/', views.blog.archive), ]
某些前缀一致的情况
这种方法可以用来去除URLconf中的冗余,其中某个模式前缀被重复使用。例如,考虑这个URLconf: from django.urls import path from . import views urlpatterns = [ path('<page_slug>-<page_id>/history/', views.history), path('<page_slug>-<page_id>/edit/', views.edit), path('<page_slug>-<page_id>/discuss/', views.discuss), path('<page_slug>-<page_id>/permissions/', views.permissions), ] 我们可以改进它,通过只声明共同的路径前缀一次并将后面的部分分组: from django.urls import include, path from . import views urlpatterns = [ path('<page_slug>-<page_id>/', include([ path('history/', views.history), path('edit/', views.edit), path('discuss/', views.discuss), path('permissions/', views.permissions), ])), ]
反向解析
from django.urls import path from . import views urlpatterns = [ path('articles/<int:year>/', views.year_archive, name='archive'), ] 根据这种设计,对应于年度归档文件的URL是 /articles/<nnnn>/ 你可以使用以下方法在模板代码中获取这些: <a href="{% url 'archive' 2012 %}">2012 Archive</a> 或者在Python代码中: from django.http import HttpResponseRedirect from django.urls import reverse def redirect_to_year(request): year = 2006 return HttpResponseRedirect(reverse('archive', args=(year,)))
命名空间
注意:如果直接使用name做反向解析(即使用了include),也不需要设置app_name,但是使用namespace,需要设置app_name # 1.项目的urls from django.urls import path, include urlpatterns = [ path('myapp/', include('MyApp.urls', namespace='my')), path('yourapp/', include('YourApp.urls', namespace='you')), ] # 2.1 MyApp.urls.py from django.urls import path from MyApp import views app_name = 'myxxx' # 在各个APP级别的urls中设置app_name urlpatterns = [ path('index/', views.index, name="index"), path('home/', views.home, name="home"), ] # 2.2 MyApp.Views.py from django.shortcuts import render, redirect, HttpResponse from django.urls import reverse def index(request): return HttpResponse("MyApp-index") def home(request): print("home") return redirect(reverse('my:index')) # return redirect(reverse('myxxx:index')) # 也可以使用app_name # 3.1 YourApp.urls.py from django.urls import path from YourApp import views app_name = 'yourxxx' # 在各个APP级别的urls中设置app_name urlpatterns = [ path('index/', views.index, name="index"), path('hello/', views.hello, name="hello"), ] # 3.2 YourApp.Views.py from django.shortcuts import render, redirect, HttpResponse from django.urls import reverse def index(request): return HttpResponse("YourApp-index") def hello(request): print("hello") return redirect(reverse('you:index')) # return redirect(reverse('yourxxx:index')) # 也可以使用app_name # 4. 在模板中使用 <a href="{% url 'my:index' %}">myapp-index</a> # 可以写namespace <a href="{% url 'yourxxx:index' %}">your-index</a> # 可以写app_name
以上加上昨天的内容就是全部的两者之间的区别,重在吸收吧,明天再彻底复习Django的视图模板部分的内容即可恢复正常学习进度。
今天的集体学习真的是浪费时间啊。。。