2012-02-06 13 views
7

Estoy tratando de usar django-haystack (hace alrededor de 2 días), y tengo el ejemplo básico de Inicio funcionando y se ve muy impresionante. Ahora me gustaría probar la función de autocompletar en el pajar.django haystack autocompletar

http://readthedocs.org/docs/django-haystack/en/v1.2.4/autocomplete.html

La primera parte parece estar bien: "Configuración de los datos" parece bastante simple. Sin embargo, no estoy seguro de que la "Realización de la consulta" debe ser escrito: es decir, en qué punto de vista debo incluir:

from haystack.query import SearchQuerySet 
sqs = SearchQuerySet().filter(content_auto=request.GET.get('q', '')) 

Mi urls.py actual es simple y configurado de la siguiente manera:

urlpatterns = patterns('', 
    # Examples: 
    ('^hello/$', hello), 
    (r'^$', hello), 
    (r'^search/', include('haystack.urls')), 
    # url(r'^$', 'mysite.views.home', name='home'), 
    # url(r'^mysite/', include('mysite.foo.urls')), 

    # Uncomment the admin/doc line below to enable admin documentation: 
    #url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 

    # Uncomment the next line to enable the admin: 
    url(r'^admin/', include(admin.site.urls)), 
) 

Mirando el blog siguiente:

http://tech.agilitynerd.com/haystack-search-result-ordering-and-pre-rende

me gustaría tener algo como:

url(r'^search/', SearchView(load_all=False,searchqueryset=sqs),name='haystack_search'), 

pero, ¿dónde se deberían especificar los cuadrados? en el urls.py o views.py? Intenté ambos, pero me dan un "error" de nombre que no se encuentra en la declaración de sqs.

Respuesta

4

Normalmente esto sería en sus propias URL de pajar, haystack.urls en su urls.py actual está apuntando a las urls predeterminadas. Cree un archivo haystack_urls.py y en su urls.py agréguelo, p.

url(r'^search/', include('yourproject.haystack_urls')), 

en ese archivo, puede agregar su código personalizado, p.

from haystack.views import SearchView 
from haystack.query import SearchQuerySet 

sqs = SearchQuerySet() # edit remove line that was incorret 

urlpatterns = patterns('haystack.views', 
    url(r'^&', SearchView(load_all=False,searchqueryset=sqs),name='haystack_search'), 
) 

para envolver una vista para solicitud de intentar algo así como

class SearchWithRequest(SearchView): 

    __name__ = 'SearchWithRequest' 

    def build_form(self, form_kwargs=None): 
     if form_kwargs is None: 
      form_kwargs = {} 

     if self.searchqueryset is None: 
      sqs = SearchQuerySet().filter(content_auto=self.request.GET.get('q', '')) 
      form_kwargs['searchqueryset'] = sqs 

     return super(SearchWithRequest, self).build_form(form_kwargs) 
+0

Hola JamesO: gracias s de nuevo por rescatarme. Intenté implementar lo que me sugirieron, pero sigo recibiendo el error de nombre en "solicitud". He pegado el código y traceback en: http://dpaste.com/698473/ No estoy seguro de por qué recibo este error de solicitud. – JohnJ

+1

por favor, por supuesto, la solicitud no está disponible, debe envolverla en su propia vista personalizada, que tendría acceso a la solicitud ... por ejemplo, una vista que establece sqs como ya tiene abd devuelve http: // readthedocs.org/docs/django-haystack/es/v1.2.4/views_and_forms.html # basic-search-request-template-search-search-html-load-all-true-form-class-modelsearchform-searchqueryset-none-context- class-requestcontext-extra-context-none-results-per-page-none – JamesO

+0

James, ¿qué quieres decir con abd returns? (lo siento, nunca escuché eso). De acuerdo. ¿Quiere decir que debería escribir una función views.py que devuelva sqs? ¿Debería ser la clase algo así como: clase MySearchView (SearchView): luego def sqs (self): sqs = SearchQuerySet(). Filter (content_auto = request.GET.get ('q', '')) return sqs? Pero no puedo ver cómo puedo pasar esto en sqs = SearchQuerySet(). Gracias de nuevo – JohnJ

1

La solución de JamesO no estaba trabajando para mí, así que define una clase de formulario personalizado, que en realidad reemplaza el método de 'búsqueda' solamente. Así que, en general, usted tiene que tratar

  • En su uso urls.py FacetedSearchView INSTED de basic_search o SearchView.
  • Cree su propia clase de formulario, reemplazando el método de búsqueda:

    class FacetedSearchFormWithAuto(FacetedSearchForm):   
        def search(self):       
         if not self.is_valid(): 
          return self.no_query_found() 
    
         if not self.cleaned_data.get('q'): 
          return self.no_query_found() 
    
         sqs = self.searchqueryset.autocomplete(content_auto=self.cleaned_data['q']) 
    
         if self.load_all: 
          sqs = sqs.load_all()  
    
         for facet in self.selected_facets: 
          if ":" not in facet: 
           continue 
    
          field, value = facet.split(":", 1) 
    
          if value: 
           sqs = sqs.narrow(u'%s:"%s"' % (field, sqs.query.clean(value))) 
    
         return sqs 
    
  • especifique form_class en FacetedSearchView form_class=FacetedSearchFormWithAuto

+0

content_auto == self -> content_auto = self – mnowotka

+0

@mnowotka thnx! – eviltnan

Cuestiones relacionadas