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

ヘイスタック .url:

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.is_valid and」を self.cleaned_data[''] の前に追加すると、エラーが解消されました。お役に立てれば。

そう、

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 に答える