django haystack自定义表单

Bud*_*sno 5 django-haystack

我正在尝试使用django haystack创建自定义搜索表单,我只是从haystack的文档中修改:

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
Run Code Online (Sandbox Code Playgroud)

至 :

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
Run Code Online (Sandbox Code Playgroud)

haystack .urls:

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

当我去网址时,它说:/ error /中的AttributeError

'CustomSearchForm'对象没有'cleaning_data'属性

你们能帮助我吗?谢谢

然后我尝试评论搜索方法,但是当我在自定义字段中提交一个单词时,结果总是一无所获,只有当我向非自定义字段提交单词时,它才能给我想要的结果,已经尝试理解这个整天,请帮忙

小智 9

我知道这是一个有点老问题,但是为了帮助那些可能正在查看这个并想知道同样事情的人,这就是我在相同情况下工作的方式.

这些方面的东西:

...
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
Run Code Online (Sandbox Code Playgroud)

基本上,我在self.cleaned_data ['']之前添加了'self.is_valid和'这为我摆脱了错误.希望这可以帮助.

所以,

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
Run Code Online (Sandbox Code Playgroud)

会成为:

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
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来做到这一点,我是django/python的相对初学者,但它对我有用.