现有答案很好地解释了 Django 中这个 reverse() 函数的什么。
但是,我希望我的回答能对 为什么 有所启发:为什么使用 reverse() 代替其他更直接、可以说更 Python 的方法在模板视图绑定中,以及这种“重定向 via reverse() 模式”在 Django 路由逻辑中流行的一些正当理由。
正如其他人所提到的,一个关键的好处是 URL 的反向构造。就像您如何使用 {% url "profile" profile.id %} 从您的应用程序的 url 配置文件中生成 url 一样:例如path('<int:profile.id>/profile', views.profile, name="profile").
但正如 OP 所指出的,reverse() 的使用也通常与HttpResponseRedirect 的使用结合使用。但为什么呢?
我不太确定这是什么,但它与 HttpResponseRedirect 一起使用。这个 reverse() 应该如何以及何时使用?
考虑以下views.py:
from django.http import HttpResponseRedirect
from django.urls import reverse
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected = question.choice_set.get(pk=request.POST['choice'])
except KeyError:
# handle exception
pass
else:
selected.votes += 1
selected.save()
return HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
))
还有我们最小的urls.py:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('<int:question_id>/results/', views.results, name='polls-results'),
path('<int:question_id>/vote/', views.vote, name='polls-vote')
]
在vote() 函数中,else 块中的代码使用reverse 和HttpResponseRedirect,模式如下:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
首先,这意味着我们不必对 URL 进行硬编码(符合 DRY 原则),但更重要的是,reverse() 提供了一种通过处理从参数中解包的值来构造 URL 字符串的优雅方法(@987654338 @ 由 URLConfig 处理)。假设question 有一个属性id 包含值5,那么从reverse() 构造的URL 将是:
'/polls/5/results/'
在普通的模板视图绑定代码中,我们使用HttpResponse() 或render(),因为它们通常涉及较少的抽象:一个视图函数返回一个模板:
def index(request):
return render(request, 'polls/index.html')
但在许多合法的重定向案例中,我们通常关心从参数列表构造 URL。其中包括以下情况:
- 通过
POST请求提交HTML表单
- 用户登录后验证
- 通过 JSON Web 令牌重置密码
其中大部分涉及某种形式的重定向,以及通过一组参数构造的 URL。希望这增加了已经有帮助的答案!