2017-03-20 48 views
0

我正在尋找一種簡單的方法來爲我的對象實現一個過濾器。一個基本的。我能找到的只有Django + Haystack + Solr或Elasticsearch。我沒有使用Java應用程序的經驗。另外...我想保持簡單。Django 1.10超級簡單過濾器

我能得到的最接近的是django_filter,但是它的文檔是......不適合像我這樣的noob。另外我不能和普通的Django一樣嗎?我能夠簡單的搜索工作,沒有solr :)而且我能夠讓過濾器在管理工作,所以所有的工具都在那裏。

如果有人可以指導我一步一步如何設置過濾器和狀態從我的模型。 型號

class Contact(models.Model): 
    name = models.CharField(max_length=2000 
    phone = models.CharField(max_length=10) 
    url = models.URLField(max_length=200, default="https://") 
    email = models.EmailField(max_length=25, verbose_name="Email", default="[email protected]") 
    STATUS = (
('A','Active'), 
('U','Unactive') 
     ) 
    status = models.CharField(max_length=1, choices=TYPE, default="A") 
     def _unicode_(self): 
     return self.name 
    def _str_(self): 
     return self.name 

我使用搜索訪問量:

def index(request): 
    #full list 
    queryset_list = Contact.objects.all() 
    #search 
    query = request.GET.get("q") 
    if query: 
     queryset_list = queryset_list.filter(
      Q(name__icontains=query)| 
      Q(phone__icontains=query)| 
      Q(url__icontains=query)| 
      Q(email__icontains=query)| 

    #pagination 
    paginator = Paginator(queryset_list, 10) 
    page_request_var = "page" 
    page = request.GET.get(page_request_var) 
    try: 
     queryset = paginator.page(page) 
    except PageNotAnInteger: 
     queryset = paginator.page(1) 
    except EmptyPage: 
     queryset = paginator.page(paginator.num_pages) 

    context = { 
     "object_list": queryset, 
     "name" : "List", 
     "page_request_var": page_request_var, 
      } 

    return render(request, "index.html", context) 
+0

所以,你已經filte通過GET參數來響您的查詢。你想過濾什麼? –

+0

我想爲STATUS添加過濾器選項。所以潛在用戶可以獲得所有活動,無效或所有聯繫人。聽起來很簡單...我只需要一個正確的方向,因爲我可以谷歌包括這個複雜的Java解決方案。 –

+0

兩種方式。您可以手動執行此操作,並使用名稱「status」在HTML中創建另一個表單域。在表單提交中,您將在request.GET中提交它。用另一個使用它的Q對象過濾查詢並將其傳遞迴上下文以設置表單字段值。第二種方法實際上是使用Django過濾器,它根本不難。我可以告訴你。 –

回答

1

我給您一個最低的例子,只是讓你讀了一些文檔的情況下,你有一些錯誤。

首先,將您的狀態選項放入設置文件中,以防萬一您可以在其他地方使用。

STATUS_CHOICES = (
    ('A','Active'), 
    ('U','Unactive') 
) 

然後,你需要創建一個過濾器集,把它變成models.py現在:

from django.conf import settings 
import django_filters 

class SearchFilter(django_filters.FilterSet): 
    status = django_filters.ChoiceFilter(choices=settings.STATUS_CHOICES) 

    class Meta: 
     model = Contact 

然後在您的視圖:

def index(request): 
    queryset_list = Contact.objects.all() 
    query = request.GET.get('q', '') 

    if query: 
     queryset_list = queryset_list.filter(
      Q(name__icontains=query) | Q(phone__icontains=query) | 
      Q(url__icontains=query) | Q(email__icontains=query) 
     ) 

    filtered = SearchFilter(request.GET, queryset=queryset_list) 
    context = { 
     'filtered': filtered, 
    } 

    return render(request, 'index.html', context) 

最後,在把這個模板:

... 
{{ filtered.form.status }} 
... 
+0

起初發生這種情況:'AssertionError:設置'Meta.model'沒有'Meta.fields'或'Meta.exclude'從0.15.0開始已被棄用,現在不允許使用。爲SearchFilter類添加一個明確的'Meta.fields'或'Meta.exclude'。'但我設法獲取信息並添加了'fields = ['status']'。所以沒有更多的錯誤。儘管如此,我仍然沒有完全發揮功能 - 我猜想缺少模板 –

+0

在我的搜索框旁邊的下拉列表中顯示我想要的值。我的搜索工作。但是,當我從過濾器下拉選擇一個值並單擊過濾器...沒有任何反應。 :('form action =「」method =「get」> {{filtered.form.status}} ' –

+0

好的,所以你已經知道你需要將字段添加到要對其進行篩選的Meta類:) –