【发布时间】:2015-06-06 09:16:30
【问题描述】:
TLDR:在创建惰性对象之后,我希望能够像这样在reverse_lazy('view', kwargs={'slug':'my_page'}) 中提供slug:reverse_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_url 和self.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