django3.0.4反向解析

一、反向解析的目的

当某一个url配置的地址发生变化的时候,页面上使用反向解析生成的地址不需要发生变化,根据url正则表达式的配置生成url

二、配置步骤

1.在项目的urls文件中包含具体应用的urls文件制定他的namespace,需要注意的是:include()这个函数中是两个参数,一个arg,一个namespace,参数arg是一个元组,元组中一个是地址,一个是app的名字,第二个namespace是为了在反向解析中定位到这个应用中用的。如果不出一会出现错误,错误提示可以看第四点。所以填写如下:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include(('booktest.urls','booktest'),namespace='booktest')), # 设置namespace,为了做反向解析
]

在这里插入图片描述

2.给应用中urls中配置制定的name,配置如下:

from django.urls import path, re_path
from booktest import views
urlpatterns = [
    path('index/',views.index,name='index'), # 配置index的路由
    path('url_reverse/',views.url_reverse), # 反向解析
    re_path('show_args/(\d+)/(\d+)/',views.show_args,name='show_args'), # 有位置参数的
    re_path('show_kwargs/(?P<c>\d+)/(?P<d>\d+)',views.show_kwargs,name='show_kwargs'), # 有关键字参数
    path('test_reverse/',views.test_reverse), # 视图中的反向解析
    ]

在这里插入图片描述

三、使用

反向解析有两个地方会用到一个是模板文件中另一个是在视图中的重定向
1.先说第一个在模板文件中的使用,需要第一个标签来进行使用,使用分三种,1)只有一个连接;2)有位置参数的传入;3)有关键字参数的传入
1)只有一个连接的使用:
{% url ‘namespace名字:name名字’ %}
2) 有位置参数的使用:xx表示位置参数
{% url ‘namespace名字:name名字’ x x %}
3) 有关键字参数的使用:
{% url ‘booktest:show_kwargs’ 关键字1=x 关键字2=x %}
具体使用方法如图所示:
在这里插入图片描述

2.再来说在试图中重定向的使用
第一步:需要先导入一个模块 reverse 在django3.0.4版本中这个模块在django.urls中。
第二步:使用,也分三种重定向1)只有一个连接;2)有位置参数的传入;3)有关键字参数的传入
1)只重定向一个连接:

url_reverse = reverse('booktest:index')
return redirect(url_reverse)
  1. 有位置参数的传入(1,2)
url_reverse = reverse('booktest:show_args',args=(1,2))
return redirect(url_reverse)
  1. 有关键字参数的传入
 url_reverse = reverse('booktest:show_kwargs',kwargs={'c':3, 'd':4})
return redirect(url_reverse)

总结:可以看出来视图中使用是位置参数是用一个元组传入,关键字参数使用字典传入。
具体使用如图:
在这里插入图片描述

四、出现过的错误

'Specifying a namespace in include() without providing an 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.

出现错误的原因;
这个原因在配置的时候已经提到了,错字在项目中的urls文件中的namespace的配置,在include()函数中缺少参数的原因,当初使用的是这样子的:(错误示范)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include(('booktest.urls'),namespace='booktest')), # 设置namespace,为了做反向解析
]

正确示范:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include(('booktest.urls','booktest'),namespace='booktest')), # 设置namespace,为了做反向解析
]
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页