2015-06-06 40 views
0

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_urlself.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,因爲它不應該知道映射。

回答

1

這是一個黑客,但我想要做什麼......

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的方法。