【问题标题】:Providing parameters when reverse_lazy-ing a success_url redirect在 reverse_lazy-ing 成功 URL 重定向时提供参数
【发布时间】:2015-06-06 09:16:30
【问题描述】:

TLDR:在创建惰性对象之后,我希望能够像这样在reverse_lazy('view', kwargs={'slug':'my_page'}) 中提供slugreverse_lazy('view').apply(kwargs={'slug':'my_page'})


我有以下 url 模式,其中包含用于识别页面模型实例的 slug:

url(r'^(?P<slug>'+settings.SLUG_PATTERN+')/$', views.MyView.as_view(), name='view'),

我有另一个编辑页面的视图:

url(r'^(?P<slug>'+settings.SLUG_PATTERN+')/_edit/$',
    views.MyEditView.as_view(success_url=reverse_lazy('view')), name='edit'),

注意添加了success_url,这样当我提交带有新内容的表单时,我会被重定向到现在编辑的页面。如果我改变了我的view url 模式,我不必担心更新我的edit url 的重定向。

验证并保存表单后,视图会获取要在 HttpResponseRedirect 中使用的成功 url。但是,仅名称“视图”不足以识别 URL。我还需要知道存储在我的页面模型的 slug 字段中的 slug 名称。

这里有一个类似的问题:success_url in UpdateView, based on passed value

答案建议为每个视图编写自定义get_success_url,但必须有更好的方法。

在 django 的 edit.py 的通用视图中有这样的:

url = self.success_url.format(**self.object.__dict__)

如果success_url 以硬编码 URL 的形式给出,但带有诸如 '{slug}/' 之类的 slug 标识符,这将在我的模型中将其替换为 slug 字段。这非常接近我想要的,但我不想硬编码我的 URL。这让我想到了我的问题:

如何将参数传递给reverse_lazy 对象?我将在我的基本视图的get_success_urlself.object.__dict__ 中使用它,它可以在任何地方工作。

此外,如果我的 slug 字符串存储在单独的 Slug 模型上,我可能希望成功 URL 为 '{slug.name}/'。通过上述方法,我可以提供 URL 参数和模型属性之间的映射:

redirect_model_mapping = {'slug': '{slug.name}'}
...
def get_success_url(self):
    url = self.success_url
    if is_a_lazy_redirect(url):
        url = url.somehow_apply_parameters(redirect_model_mapping)
    return url.format(**self.object.__dict__)

我希望somehow_apply_parameters 等同于最初调用reverse_lazy('blog:view', kwargs=redirect_model_mapping)。但是我认为这不应该在urls.py 中,因为它不应该知道映射。

【问题讨论】:

    标签: django lazy-evaluation django-urls


    【解决方案1】:

    这是一个 hack,但可以做我想做的事......

    class MyView(FormMixin, ...):
    
        #this is actually set on child classes
        redirect_model_mapping = {'slug':'{slug.name}'}
    
        def get_success_url(self):
            url = self.success_url
            if url is not None:
                if hasattr(self.success_url, '_proxy____kw'):
                    url_parameters = dict((k, v.format(**self.object.__dict__)) for k, v in six.iteritems(self.redirect_model_mapping))
                    url._proxy____kw = {'kwargs': url_parameters}
                    url = force_text(url)
                else:
                    url = url.format(**self.object.__dict__)
            else:
                raise ImproperlyConfigured("No URL to redirect to.")
            return url
    

    它替换了通常传递给reverse_lazykwards 参数,但在它实际具有所需的值之后。由于reverse_lazy 也需要字符串匹配正则表达式,所以我必须先在 url 参数和模型中的值之间进行映射。

    我非常想要一种不需要写信给_proxy____kw的方法。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多