簡體   English   中英

Django 中的重定向和反向差異

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM