硬编码的URL、链接和重定向会让你在创建应用程序的时候得到一个工作的应用程序。它也会让你的应用程序随着时间的推移而损坏。在网络上,URL结构有时会发生变化,你需要一种方法来使你的应用程序在这些情况下更加灵活。Django通过**name=变量提供了命名URL,并在你的应用程序代码中使用reverse()**函数对URL进行反向解析。在本教程中,我们将在Django中测试这些功能。
urls.py中的name=
为了开始使用命名的URLs,我们必须给一个URLs分配一个名字。
from django.urls import path
from . import views
urlpatterns = [
path('<int:timeframe>', views.goals_by_int_timeframe),
path('<str:timeframe>', views.goals_by_timeframe, name='namedurl'),
]
注意在第二个path()函数中增加了第三个参数。我们将name的关键字参数设置为namedurl的字符串值。Django现在能够通过字符串值'namedurl'直接识别这个路由。
views.py中的reverse()函数
这个等式的另一面是利用views.py文件中的**reverse()**函数。在使用它之前,需要先从django.urls中导入反向函数。下面的高亮代码显示了导入和使用。
from django.shortcuts import redirect, render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
# dictionary data store
goals = {
'daily': 'Learn Something New',
'weekly': 'Take a day off',
'monthly': 'Complete a creative course'
}
def goals_by_int_timeframe(request, timeframe):
timeframes = list(goals.keys())
redirect_to = timeframes[timeframe - 1]
named_redirect = reverse('namedurl', args=[redirect_to])
return HttpResponseRedirect(named_redirect)
def goals_by_timeframe(request, timeframe):
goal = goals[timeframe]
return HttpResponse(goal)
由于namedurl路由有一个变量(捕获的变量),那么在调用reverse()函数时必须指定它。这个方法是通过指定**args=**的关键字参数来实现的。 这个参数希望是一个列表,所以如果你只有一个值要传入,只要把它作为一个包含在列表中的值传入即可。这就是我们在这里的代码中的做法。继续访问http://127.0.0.1:8000/goals/1、http://127.0.0.1:8000/goals/2、http://127.0.0.1:8000/goals/3,测试一下这个应用程序。这些URLs继续完美地工作,尽管我们没有在重定向中直接指定它们。然而,真正的好处是,这个URL结构对变化更加强大。现在我们通过 "目标/"路线从主项目urls.py进入这个应用程序。如果这在将来需要改变呢?如果上面的重定向是硬编码的,这将是不可能的,并且会导致应用程序崩溃。在我们的例子中,由于有了Named URLs和reverse()函数,我们现在*可以改变这个入口URL。在主项目urls.py中,让我们把 "goals/"改为 "tasks/",看看会发生什么。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('tasks/', include('goals.urls'))
]
即使有了新的URL结构,该应用程序仍能继续工作。
HTML模板中的url标签
反向函数不用于模板中,以生成动态链接。相反,你可以使用url标签来输出链接,而不必在你的模板中硬编码URLs。
Django中的命名URL和反转函数总结
当你需要在Django项目中创建路径和链接时,最好避免硬编码,而是使用命名的URLs和包含的reverse()函数。如果你对链接和重定向进行硬编码,未预见到的URL变化可能会在以后完全破坏你的应用程序。