【问题标题】:Django RedirectView with slug in the URLURL 中带有 slug 的 Django RedirectView
【发布时间】:2019-04-04 12:40:13
【问题描述】:

我正在使用 Django 获取 RedirectView,我想知道如何在我的 url 中传递一个 slug。

在我的 Django Web 应用程序中,用户可以在购物车中设置一个或多个文档,然后打开带有个人信息的模式,然后提交表单并收到一封包含已检查文档的电子邮件。

我的应用程序中的这个 url 看起来像这样:

http://localhost:8000/freepub/home?DocumentChoice=<code>&DocumentSelected=Add+document

&lt;code&gt; 对应一个唯一的文档代码(例如:PUBSD15-FR-PDFPUBSD01-EN-EPUB

但是这个url有点复杂,因为它应该添加到另一个应用程序中。

这就是为什么我使用RedirectView 来简化这个网址:

url(r'^freepub/direct/download/(?P<code>[\w\.-]+)/', 
       RedirectView.as_view(url="http://localhost:8000/freepub/home?DocumentChoice=(?P<code>[\w\.-]+)&DocumentSelected=Add+document"),
       name='go-to-direct-download')

问题:

如果我写在我的网址中:http://localhost:8000/freepub/direct/download/PUBSD15-FR-PDF

重定向是:http://localhost:8000/freepub/home?DocumentChoice=(?P&lt;code&gt;[%5Cw%5C.-]+)&amp;DocumentSelected=Add+document

如何在我的网址中考虑 code 而不是 (?P&lt;code&gt;[%5Cw%5C.-]+)

谢谢

【问题讨论】:

    标签: regex django django-urls


    【解决方案1】:

    您可以为此将RedirectView 子类化:

    # app/views.py
    
    from django.http import QueryDict
    
    class MyRedirectView(RedirectView):
    
        def get_redirect_url(self, *args, **kwargs):
            q = QueryDict(mutable=True)
            q['DocumentChoice'] = self.kwargs['code']
            q['DocumentSelected'] = 'Add document'
            return 'http://localhost:8000/freepub/home?{}'.format(q.urlencode())

    然后将其用作:

    url(
        r'^freepub/direct/download/(?P<code>[\w\.-]+)/', 
        MyRedirectView.as_view(),
       name='go-to-direct-download'
    ),
    

    但是,建议通过视图名称获取重定向的 URL,例如使用 reverse [Django-doc],因为现在 URL 是硬编码的,如果您稍后部署应用程序或更改主机名,它将导致错误的重定向。

    此外,在 Django 中,通常不会通过 GET 参数传递太多数据,因此最好创建一个视图,并将该部分编码到 URL 路径中,而不是查询字符串。

    【讨论】:

    • 我将尝试您的解决方案,然后我将编辑我的代码以将 GET 参数更改为 POST 对吗?无论如何,谢谢你的回答,如果它有效,我会回来;)
    • @Ducky:通常只使用路径,就像您在此处使用 URL 所做的那样。 POST 参数通常用于表单。
    • 您是否认为按照我的流程来回答您的问题是一种不好的方式?你的回答很好!
    • @Ducky:不,本身不是,更多的是它有点“un-django”,这本身并不是一个大问题。唯一可能由此产生的问题是,并非所有库等都旨在处理此问题。但这不是一个“直接”的问题。
    • 好的,非常感谢您的帮助!一如既往,这是一个很好的答案,现在我的应用程序在这一点上工作得很好。谢谢!
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2018-10-22
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多