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

Posted

技术标签:

【中文标题】如何在 Django 中使用来自 urls.py 的变量重定向 url 模式?【英文标题】:How to redirect url pattern with variables from urls.py in Django? 【发布时间】:2015-10-18 02:35:32 【问题描述】:

我想从urls.py重定向url模式带变量

我参考了other *** solution,但我不知道 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&lt;id&gt;\d+)/,而不是/permalink/1/

有什么解决方法不使用views.py

我当然知道使用控制器的解决方案,但我想知道使用 url 模式是否有更简单的解决方案。

【问题讨论】:

【参考方案1】:

url='/permalink/(?P&lt;id&gt;\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。相反,您可以继承 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 放在您的视图模块中是一种很好的做法。然后,您可以使用以下内容将视图添加到您的 url 模式:

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

【讨论】:

以上是关于如何在 Django 中使用来自 urls.py 的变量重定向 url 模式?的主要内容,如果未能解决你的问题,请参考以下文章

Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?

Django Rest Framework - 如何在 urls.py 中获取 Http 标头信息

如何在 Django tests.py 文件中的每次测试后重新评估我的 urls.py 文件?

刷新 django 中的 urls.py 缓存

如何让 Django urls.py 识别 url 中的 # (hash)?

使用 Django,有没有更好的方法在 urls.py 中动态导入视图?