2012-07-13 22 views
5

que estoy tratando de hacer una búsqueda personalizada utilizando pajar Django, acabo de modificar en la documentación del pajar:Django pajar formulario personalizado

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 

a:

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'), 
) 

cuando voy a la url, que dice: AttributeError en/Búsqueda/

objeto 'CustomSearchForm' no tiene atributo 'cleaned_data'

pueden ustedes ayudarme? thx

Luego trato de comentar el método de búsqueda, pero cuando envío una palabra en el campo personalizado, el resultado es siempre nada, solo cuando presento una palabra en un campo no personalizado puedo dar el resultado que quiero, Ya intenté entender esto todo el día, por favor ayuda

Respuesta

9

Sé que esta es una pregunta un poco vieja, pero para ayudar a otros que pueden estar viendo esto y preguntándose lo mismo, así es como lo hice funcionar en la misma situación .

Algo a lo largo de estas líneas:

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

Básicamente, he añadido 'self.is_valid y' antes self.cleaned_data [ ''] este se deshizo del error para mí. Espero que esto ayude.

Así,

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 

se convertiría en:

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 

Puede haber una mejor manera de hacer esto, y yo soy un principiante relativa para Django/Python pero funcionó para mí.

+1

Aquí está una mejor manera, 'if esinstance (sqs, EmptySearchQuerySet): return sqs' lo hace después de la llamada' super() 'y elimina todo el' is_valid() ' – nitely

Cuestiones relacionadas