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

 
posted @ 2020-12-30 11:20  腹肌猿  阅读(194)  评论(0编辑  收藏  举报