TLDR:我希望能夠在reverse_lazy('view', kwargs={'slug':'my_page'})
中提供slug
,如下所示:reverse_lazy('view').apply(kwargs={'slug':'my_page'})
,創建懶惰對象後。當reverse_lazy-success_url重定向時提供參數
我有包括塞來識別頁面模型實例以下URL模式:
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
網址格式,我不必擔心爲我的edit
網址更新重定向。
表單驗證並保存後,該視圖抓取成功url以用於HttpResponseRedirect
。然而,只有「視圖」這個名稱不足以識別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
領域取代它在我模型。這與我想要的非常接近,但我不想對我的URL進行硬編碼。這使我想到我的問題:
如何將參數傳遞給reverse_lazy
對象?我會在我的基本視圖的get_success_url
與self.object.__dict__
中使用它,它只是在任何地方工作。
此外,如果我的子彈字符串存儲在單獨的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
,因爲它不應該知道映射。