鉴于以下情况:
def add(request):
if request.method == "POST":
task = request.POST.get('task')
form = NewTaskForm(request.POST)
if form.is_valid():
task = form.cleaned_data["task"]
request.session['tasks'] += [task]
# return HttpResponseRedirect(reverse("tasks:index"))
return redirect('tasks:index')
else:
return render(request, "tasks/add.html",{
"form": form
})
return render(request, "tasks/add.html",{
"form": NewTaskForm()
})
有什么区别,为什么你会使用其中一个而不是另一个:
return HttpResponseRedirect(reverse("tasks:index"))
和:
return redirect('tasks:index')
最佳答案
redirect(…)
是 implemented as [GitHub] :
def redirect(to, *args, permanent=False, **kwargs): redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect return <b>redirect_class(</b>resolve_url(to, *args, **kwargs)<b>)</b>
其中 resolve_url
是 reverse(…)
function [Django-doc] 周围的一层,正如我们在 source code [GitHub] 中看到的那样:
def resolve_url(to, *args, **kwargs): """ Return a URL appropriate for the arguments passed. The arguments could be: * A model: the model's `get_absolute_url()` function will be called. * A view name, possibly with arguments: `urls.reverse()` will be used to reverse-resolve the name. * A URL, which will be returned as-is. """ # If it's a model, use get_absolute_url() if hasattr(to, 'get_absolute_url'): return to.get_absolute_url() if isinstance(to, Promise): # Expand the lazy instance, as it can cause issues when it is passed # further to some Python functions like urlparse. to = str(to) if isinstance(to, str): # Handle relative URLs if to.startswith(('./', '../')): return to # Next try a reverse URL resolution. try: return reverse(to, args=args, kwargs=kwargs) except NoReverseMatch: # If this is a callable, re-raise. if callable(to): raise # If this doesn't "feel" like a URL, re-raise. if '/' not in to and '.' not in to: raise # Finally, fall back and assume it's a URL return to
因此,这是一种更“丰富”的 URL 解析方式,因为:
- 如果该对象有
.get_absolute_url()
method [Django-doc]它将返回该方法的结果; - 如果是一个
Promise
,它将评估该promise; - 如果是相对URL,则返回该URL;和
- 如果
reverse(…)
失败并且它看起来像一个URL,它将返回您传递给它自己的值,从那时起它假设它是一个(绝对)网址。
因此,它不仅旨在找到具有该名称的 View ,而且还执行一些额外的操作。
此外,通过重定向,使用参数的方式更加方便。如果网址如下所示:
app_name = 'tasks'
urlpatterns = [
# …,
path('page/<b><slug:myslug></b>/', some_view, name='page')
]
然后,当您使用 reverse(...)
时,您可以为 myslug
参数提供一个值:
return HttpResponseRedirect(reverse('tasks:index'<b>, args=('value',)</b>))
或者:
return HttpResponseRedirect(reverse('tasks:index'<b>, kwargs={'myslug': 'value'}</b>))
对于重定向,您可以使用:
return redirect('tasks:index'<b>, 'value'</b>)
或者:
return redirect('tasks:index'<b>, myslug='value'</b>)
关于Django HttpResponseRedirect 与重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64840329/