2015-11-13 22 views
1

我有一個從ListView派生的通用基於類的視圖。該視圖應與forms.py中聲明的表單交互,以通過GET查詢過濾objects_list,並修改上下文(如果您對我爲什麼想要這樣做感興趣,請檢查我的previous question)。Django的GET窗體在ListView和上下文修改中

這意味着我需要get_querysetget_context_data方法中的一個表格實例(form = MyForm(request.GET))。


This solution是不能接受的,因爲這是違反this編碼原則,假設get_queryset總是最先被調用(這可能不是在Django的未來版本的情況下)。

實施例:

def get_queryset(self): 
    self.form = MyForm(self.request.GET) 

This solution是不能接受的,因爲它使用的原始參數GET而我們想利用的形式自動解析/驗證的全部潛力。

例子:

def get_queryset(self): 
    a_form_field = self.kwargs["a_form_field"] 

這可能不違反任何良好的設計原則呢?

+0

你是什麼意思「假定get_queryset總是會被首先調用?」首先在什麼之前? – Nick

+0

在get_context_data之前。 – Saturnix

+0

是什麼讓你覺得他們可以做到這一點?我的意思是我們絕對不想硬編碼一些Django的東西,或者依賴一些沒有記錄的特性,但是如果不依賴於一些共同的想法,我們就不能使用任何框架。就像我們不能確定他們不會將get_context_data重命名爲get_context,但這並不意味着我們不應該使用它。 – Nick

回答

1

我會重寫get方法:

class SearchList(ListView): 
    def get(self, request, *args, **kwargs): 
     self.form = MyForm(request.GET) 
     if self.form.is_valid(): 
      self.queryset = self.form.process_search(self.queryset) 

     return super(SearchList, self).get(request, *args, **kwargs) 

你的形式將需要有process_search舉行查詢集過濾流量(這種方式你保持窗體類中搜索登錄)。

之後您可以訪問self.form,您可以在模板內使用{{ view.form }}訪問它。

+0

+1,感謝您的幫助...仍然違反這個:http://stackoverflow.com/questions/19284857/instance-attribute-attribute-name-defined-outside-init – Saturnix

相關問題