2010-10-25 29 views
0

所以我有一個做了查詢集,並返回一個簡單的列表視圖:如何篩選通用視圖的object_list中的物體在Django

def cdr(request): 
    queryset = CdrView.objects.all() 
    return object_list(request, 
        queryset = queryset, 
        template_name = "reports/cdrview_list.html", 
        paginate_by = 200, 
        page = request.GET.get('page', 1) 
        ) 

最初,只知道它的工作原理,我打印的所有在我的模板中,「object_list」中的對象一行一行,沒問題,但很難看。問題是我的數據庫不斷增長,目前有超過一百萬個對象。每個對象(就像電話一樣)具有源和目標以及其他屬性,如方向(進入或退出)。在我的模板中,我通過執行以下操作來調用它:
{{call.src}} {{call.dst}} 由於我在Django中相當新,所以我有一個關於如何使窗體成爲顯示在我的頁面頂部,我選擇僅查看具有方向爲「in」的來電或具有以「xxxx」開頭的來源的來電。基本上是過濾器。 我是否在我的視圖中完成大部分過濾? 或者它在我的模板?

謝謝!

回答

3

你在你的views.py過濾通過。由於這是搜索,我們將使用request.REQUEST而不是正常的request.POST

from forms.py import SearchForm 

def cdr(request, form_class=SearchForm): 
    queryset = CdrView.objects.all() 
    search_form = SearchForm(request.REQUEST) 
    if search_form.is_valid(): 
     search_src = search_form.cleaned_data.get('search_src',None) 
     search_dest = search_form.cleaned_data.get('search_dest',None) 
     if search_src: 
      queryset = queryset.filter(src__icontains=search_src) 
     if search_dest: 
      queryset = queryset.filter(dest__icontains=search_dest) 
    return object_list(request, 
        queryset = queryset, 
        template_name = "reports/cdrview_list.html", 
        extra_context = {'search_form': search_form }, 
        paginate_by = 200, 
        page = request.GET.get('page', 1) 
        ) 

然後,在forms.py

from django import forms 

class SearchForm(forms.Form): 
    search_src = forms.CharField(max_length=20, required=False) 
    search_dest = forms.CharField(max_length=20, required=False) 

,然後在模板:

<form method="get" action=""> 
<ul>{{ search_form.as_ul }}</ul> 
<input type="submit" value="Search" /> 
</form> 
1

你應該做你所有的業務邏輯的觀點,這是與MVC(MTV)框架內工作的基本思路。

旁邊,如果你想使用表單過濾你的數據,你沒有選擇,而不是從view.py

+0

好吧,是啊,這就是我猜到了。是否有可能通過泛型視圖特別是object_list來做到這一點?因爲我用來做這件事的方式是使用RequestContext(request,{xxxx:xxxx})。我應該改用這種方法嗎? – chiurox 2010-10-25 22:43:36