1 min read

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'),