簡體   English   中英

如何在Django中使用urls.py中的變量重定向url模式?

[英]How to redirect url pattern with variables from urls.py in Django?

我想 urls.py 變量重定向url模式。

我引用其他stackoverflow解決方案 ,但我不知道什么時候url有一個變量,如下面的代碼。

from django.conf.urls import patterns, url
from django.views.generic import RedirectView


urlpatterns = patterns(
    url(
        r'^permalink/(?P<id>\d+)/foo/$',
        RedirectView.as_view(url='/permalink/(?P<id>\d+)/')
    ),
)

使用此代碼,django將重定向/permalink/1/foo//permalink/(?P<id>\\d+)/ ,而不是/permalink/1/

沒有使用views.py解決方案?

當然我知道使用控制器的解決方案,但我想知道使用url模式是否有任何更簡單的解決方案。

url='/permalink/(?P<id>\\d+)/'傳遞給RedirectView將不起作用,因為視圖不會替換url中的命名參數。

但是, RedirectView允許您提供pattern_name而不是要重定向到的url 使用為原始視圖傳遞的相同args和kwargs反轉url。

這將適用於您的情況,因為兩個url模式都有一個命名參數id

urlpatterns = [
    url(r'^permalink/(?P<id>\d+)/foo/$',
        RedirectView.as_view(pattern_name="target_view"),
        name="original_view"),
    url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
]

如果目標url模式使用其他參數,則不能使用urlpattern_name 相反,您可以get_redirect_url RedirectView並覆蓋get_redirect_url

from django.core.urlresolvers import reverse
from django.views.generic import RedirectView

class QuerystringRedirect(RedirectView):
    """
    Used to redirect to remove GET parameters from url

    e.g. /permalink/?id=10 to /permalink/10/   
    """

    def get_redirect_url(self):
        if 'id' in self.request.GET:
            return reverse('target_view', args=(self.request.GET['id'],))
        else:
            raise Http404()

QuerystringRedirect放在視圖模塊中是一種好習慣。 然后,您可以使用以下內容將視圖添加到您的網址模式:

urlpatterns = [
    url(r'^permalink/$', views.QuerystringRedirect.as_view(), name="original_view"),
    url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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