Urls - Django 2.0
在模版中使用命名路由
比如 urls.py 里面定义了一个 jjd_upload
路由:
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello),
path('upload/', views.image_upload, name='jdd_upload'),
]
在模版中通过 url 标签调用:
<form action="{% url 'jdd_upload' %}">
{% csrf_token %}
...
</form>
将额外的参数传入视图方法
参考如下代码,path()
方法接受一个字典作为第三个参数,可以向视图中的方法传送值(覆盖视图方法的默认值):
from django.urls import path
from . import views
urlpatterns = [
path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
]
当请求 /blog/2005/
时,Django 就会调用 views.year_archive(request, year=2005, foo='bar')
。
身份认证视图路由的注意事项
按照官方文档,使用 django 内置的身份认证功能时只需在 urls.py
中引入 path('accounts/', include('django.contrib.auth.urls'))
即可。
但我发现自定义 password_reset
视图时无法覆盖默认的 admin
模板,原因在于设置 urlpatterns 时的顺序颠倒,要自定义的视图路由一定要写在 path('accounts/', include('django.contrib.auth.urls'))
的前面。
from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/password_reset/', auth_views.password_reset, {
'template_name': 'users/password_reset_form.html'
}, name='password_reset'),
path('accounts/', include('django.contrib.auth.urls')),
path('user/', include('users.urls')),
]
由于 password_reset
方法被废弃,取而代之的是 PasswordResetView
,因此路由应改成以下写法:
path('accounts/password_reset/', auth_views.PasswordResetView.as_view(
template_name='users/password_reset_form.html',
), name='password_reset'),
会员讨论区