6

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

表格.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

到 :

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

干草堆.urls:

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

当我转到 url 时,它显示:AttributeError at /search/

“CustomSearchForm”对象没有属性“cleaned_data”

你们能帮帮我吗?谢谢

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

4

2 回答 2

10

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

这些方面的东西:

...
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

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

所以,

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

会成为:

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

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

于 2012-09-26T23:02:31.473 回答
0

问题是首先调用了 form.is_valid() 。在调用 isvalid() 方法之前,数据不会处于清理状态。因此,在验证所有字段时,它会将所有字段一一放入其cleaned_data 属性中,如果它们根据表单定义是有效的。如果任何字段使is_valid() 为false,那么clean_data 也存在并包含之前验证过的那些数据。

于 2018-09-27T19:34:53.447 回答