2012-07-13 36 views
5

Tôi đang cố gắng để thực hiện một hình thức tìm kiếm tùy chỉnh sử dụng đống cỏ khô django, tôi chỉ cần thay đổi từ tài liệu đống cỏ khô của:django Haystack hình thức tùy chỉnh

forms.py

from django import forms 
from haystack.forms import SearchForm 

class DateRangeSearchForm(SearchForm): 
    start_date = forms.DateField(required=False) 
    end_date = forms.DateField(required=False) 

    def search(self): 
     # First, store the SearchQuerySet received from other processing. 
     sqs = super(DateRangeSearchForm, self).search() 

     # Check to see if a start_date was chosen. 
     if self.cleaned_data['start_date']: 
      sqs = sqs.filter(pub_date__gte=self.cleaned_data['start_date']) 

     # Check to see if an end_date was chosen. 
     if self.cleaned_data['end_date']: 
      sqs = sqs.filter(pub_date__lte=self.cleaned_data['end_date']) 

     return sqs 

tới:

from django import forms 
from haystack.forms import HighlightedModelSearchForm 

class CustomSearchForm(HighlightedModelSearchForm): 
    title = forms.CharField(max_length = 100, required = False) 
    content = forms.CharField(max_length = 100, required = False) 
    date_added = forms.DateField(required = False) 
    post_by = forms.CharField(max_length = 100, required = False) 

    def search(self): 
     sqs = super(CustomSearchForm, self).search() 
     if self.cleaned_data['post_by']: 
      sqs = sqs.filter(content = self.cleaned_data['post_by']) 
     if self.cleaned_data['title']: 
      sqs = sqs.filter(content = self.cleaned_data['title']) 
     if self.cleaned_data['content']: 
      sqs = sqs.filter(content = self.cleaned_data['content']) 
     if self.cleaned_data['date_added']: 
      sqs = sqs.filter(content = self.cleaned_data['date_added']) 
     return sqs 

haystack .urls:

urlpatterns = patterns('haystack.views', 
    url(r'^$', search_view_factory(view_class = SearchView, form_class = CustomSearchForm), name='haystack_search'), 
) 

khi tôi đi đến url, nó nói: AttributeError tại/tìm kiếm/

đối tượng 'CustomSearchForm' không có thuộc tính 'cleaned_data'

có thể các bạn giúp tôi? Thx

Sau đó, tôi cố gắng bình luận phương pháp tìm kiếm, nhưng khi tôi gửi một từ vào trường tùy chỉnh, kết quả là không có gì, chỉ khi tôi gửi một từ đến trường tùy chỉnh, nó có thể gimme kết quả tôi muốn, đã cố gắng hiểu điều này cả ngày, xin giúp

Trả lời

9

Tôi biết đây là một câu hỏi cũ, nhưng để giúp những người khác có thể xem và tự hỏi điều tương tự, đây là cách tôi làm việc trong cùng một tình huống .

cái gì đó dọc những dòng này:

... 
def search(self) 
    sqs=super(MyFooSearchForm, self).search() 

    if self.is_valid() and self.cleaned_data['foo']: 
     sqs = sqs.filter(foostuff__exact=self.cleaned_data['foo']) 

    return sqs 

Về cơ bản, tôi đã thêm 'self.is_valid và' trước self.cleaned_data [ ''] này đã thoát khỏi những lỗi cho tôi. Hi vọng điêu nay co ich.

Vì vậy,

def search(self): 
    sqs = super(CustomSearchForm, self).search() 
    if self.cleaned_data['post_by']: 
     sqs = sqs.filter(content = self.cleaned_data['post_by']) 
    if self.cleaned_data['title']: 
     sqs = sqs.filter(content = self.cleaned_data['title']) 
    if self.cleaned_data['content']: 
     sqs = sqs.filter(content = self.cleaned_data['content']) 
    if self.cleaned_data['date_added']: 
     sqs = sqs.filter(content = self.cleaned_data['date_added']) 
    return sqs 

sẽ trở thành:

def search(self): 
    sqs = super(CustomSearchForm, self).search() 
    if self.is_valid() and self.cleaned_data['post_by']: 
     sqs = sqs.filter(content = self.cleaned_data['post_by']) 
    if self.is_valid() and self.cleaned_data['title']: 
     sqs = sqs.filter(content = self.cleaned_data['title']) 
    if self.is_valid() and self.cleaned_data['content']: 
     sqs = sqs.filter(content = self.cleaned_data['content']) 
    if self.is_valid() and self.cleaned_data['date_added']: 
     sqs = sqs.filter(content = self.cleaned_data['date_added']) 
    return sqs 

Có thể có một cách tốt hơn để làm điều này, và tôi là một người mới bắt đầu tương đối django/python nhưng nó làm việc cho tôi.

+1

Đây là cách tốt hơn, 'if isinstance (sqs, EmptySearchQuerySet): trả về sqs' thực hiện sau lệnh gọi' super() 'và xóa tất cả' is_valid() ' – nitely

Các vấn đề liên quan