2013-03-28 69 views
1

我們有很多很多的視圖,它們利用了我們用於在urls.py中循環的簡單通用視圖,並指向基於相同功能的通用視圖。現在,我們正在上課基於通用視圖,我們需要複製這個功能,我們正在被迫所有的邏輯移動到urls.py文件,像這樣:Django基於動態類的通用視圖

GENERIC_VIEWS_EDIT = ['ModelOne', 'ModelTwo', 'ModelThree', 'ModelFour', 'ModelN',] 

for model in GENERIC_VIEWS_EDIT: 
    urlpatterns += patterns('', 

     url(r'^%s/(?P<pk>\d+)/$' % model.lower(), never_cache(staff_member_required(UpdateView.as_view(
      model=eval(model), 
      context_object_name='object', 
      form_class=eval('%sForm' % model), 
      template_name='edit_form.html', 
      success_url='/yay/' 
     ))), name='edit-%s' % model.lower()), 

    ) 

這枚作品很好,我不屑於在urls.py文件中包含所有這些「查看代碼」。此外,如果我需要爲這N個模型中的一個或兩個重寫一個方法,這個實現使得這是不可能的。

有沒有什麼辦法可以將模型作爲參數傳遞並將我的通用視圖移回到views.py中,像這樣?

GENERIC_VIEWS_EDIT = ['ModelOne', 'ModelTwo', 'ModelThree', 'ModelFour', 'ModelN',] 

for model in GENERIC_VIEWS_EDIT: 
    urlpatterns += patterns('', 
     url(r'^%s/(?P<pk>\d+)/$' % model.lower(), UpdateView.as_view(model=model)), name='edit-%s' % model.lower()), 
    ) 

回答

1

你是對的。這個邏輯屬於你的視圖。

由於您使用基於類的意見,你可以繼承的UpdateView與自定義邏輯覆蓋__init__()功能:

class MyUpdateView(UpdateView): 
    template_name = 'edit_form.html' 
    success_url = '/yay/' 
    context_object_name = 'object' 

    def __init__(self, *args, **kwargs): 
     super(MyUpdateView, self).__init__(*args, **kwargs) 
     self.form_class = eval('%sForm' % self.model) 
+1

這是一類,它是一類,它是一類!我只需要不斷地告訴自己,最終會陷入沉寂。謝謝,凱爾。 – scoopseven

+0

覆蓋self.get_form_class更容易。在那裏,你只需返回表單類 – kiril

相關問題