django之url反向解析
在django中需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:
1、在模板中:使用url 模板标签。
2、在Python 代码中:使用 django.core.urlresolvers.reverse() 函数。
3、在更高层的与处理Django 模型实例相关的代码中:使用 get_absolute_url() 方法。
mydjango
│ │ db.sqlite3
│ │ manage.py│ │
│ ├───mydjango
│ │ │ settings.py
│ │ │ urls.py
│ │ │ views.py
│ │ │ wsgi.py
│ │ │ __init__.py
│ │
│ ├───myfirstapp
│ │ │ admin.py
│ │ │ apps.py
│ │ │ models.py
│ │ │ tests.py
│ │ │ urls.py
│ │ │ views.py
│ │ │ __init__.py
│ │
│ └───Templates
│ index.html
路由分发:mydjango\urls.py
from django.contrib import admin from django.urls import path,include from . import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('one/', include('myfirstapp.urls',namespace='main')), ]
子路由:myfirstapp\urls.py
from django.urls import path,include from . import views from . import views app_name="myfirst" urlpatterns = [ path('firstapp', views.firstapp, name="first"), path('index/', views.login, name="index"), ]
myfirstapp\views.py
from django.shortcuts import render from django.http import HttpResponse from django.urls import reverse from django.urls.base import get_urlconf from django.shortcuts import redirect,render,resolve_url # Create your views here. def firstapp(request): print(reverse("main:first")) #命名空间反向解析方式1 namespace:name
print(reverse("myfirst:first")) #命名空间反向解析方式2 app_name:name
return HttpResponse("First app")
def login(request):
return render(request,template_name="index.html")
Templates\index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href = "{% url 'main:first' %}">hello, namespace</a> #命名空间反向解析方式1 namespace:name <a href = "{% url 'myfirst:first' %}">hello, appname</a> #命名空间反向解析方式2 app_name:name
</body> </html>
如果没有在子路由中定义app_name, 则会报错:
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass
a 2-tuple containing the list of patterns and app_name instead.
可以看到,视图函数和模板中,都是可以用 namespace:name 或 app_name:name 方式解析到url的
/one/firstapp
/one/firstapp