[英]Redirect and reverse differences in Django
我有一個關於重定向和反向有什么區別的問題。 對性能有影響嗎。 有人可以解釋一下這 3 個代碼示例之間的區別嗎? 它們的目的是什么,我怎樣才能有效地應用它們。
if 'comment' in request.POST:
form = CommentCreationForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.comment_user = request.user
comment.comment_item = Item.objects.get(id=pk)
comment.save()
//1 return redirect('detail-page', pk=item.id)
//2 return redirect(reverse('detail-page', kwargs={'pk': item.id}))
//3 return reverse('detail-page')
(我不能在第三個參數中添加任何參數,這是我注意到的唯一區別)。
根據https://docs.djangoproject.com/en/3.2/topics/http/shortcuts/#redirect 1 和 2 是等效的。 我會假設 3 不起作用,因為它缺少?必需的? 產品編號?
由於多種原因,兩者並不相同。 第一個是reverse(…)
[Django-doc]返回一個字符串URL 以訪問該視圖。 另一方面, redirect(…
) [Django-doc]返回一個HttpResponseRedirect
object [Django-doc] 。 這個object可以被視圖返回,正常會觸發瀏覽器訪問HTTP響應中指定的頁面。 redirect(…)
有一個特殊的參數permanent=…
,它將基於該值返回一個HttpResponseRedirect
(如果permanent=False
是默認值),或者HttpResponsePermanentRedirect
代表permanent=True
。
另一個區別是reverse(…)
使用args=…
和kwargs=…
參數來填充 URL 模式的值。 這與redirect(…)
不同,其中將位置參數和命名參數作為位置參數和命名參數傳遞。 因此,這意味着如果您執行reverse( 'some_view' , args=( some_parameter ,), kwargs={'name': other_parameter })
,您將獲得 HTTP 響應,該響應指向 URL with reverse( 'some_view' , some_parameter , name= other_parameter )
。
redirect(…)
本身不適用於視圖名稱。 Indeed, if you pass a URL to the redirect(…)
function, like redirect('/foo/bar/qux/')
, it will construct a HttpResponseRedirect
that redirects to the URL /foo/bar/qux
. 這與僅根據視圖名稱及其參數構造 URL 的reverse(…)
不同。
Finally redirect(…)
also accepts a model object that has a .get_absolute_url()
method [Django-doc] will result in a HttpResponseRedirect
that redirects to the URL constructed by that .get_absolute_url()
method.
因此,您的第一行 ( //1
) 和第二 ( //2
) 行將產生相同的結果:重定向到相同 URL 的HttpResponseRedirect
,而最后一行 ( //3
) 將返回一個包含 URL 的字符串到detail-page
視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.