Listando objetos existentes y resultados de busqueda en Django

Pregunta de la clase:
Bernardo Augusto García Loaiza

Bernardo Augusto García Loaiza

Pregunta
studenthace 7 años

Tengo el modelo

LodgingOffer
con su respectivo Manager. Sobre el quiero efectuar algunas bùsquedas, para lo cual estoy usando
solr
y
haystack

<code> class LodgingOfferManager(models.Manager): def active(self, *args, **kwargs): return super(LodgingOfferManager, self).filter(is_taked=False).filter(pub_date__lte=timezone.now())

Este es el modelo

LodgingOffer

<code> def get_images_search_path(instance, filename): return '/'.join(['lodging_offer_images', instance.slug, filename]) class LodgingOffer(models.Model): created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) ad_title = models.CharField(null=False, blank=False, max_length=255, verbose_name='Título de la oferta') photo = models.ImageField(upload_to=get_images_search_path, blank=False, verbose_name='Fotografía', null=False) pub_date = models.DateTimeField(auto_now_add=True) is_taked = models.BooleanField(_('Oferta tomada'), default=False,) objects = LodgingOfferManager() def __str__(self): return "%s" % self.ad_title

Para efectuar las bùsquedas tengo este formulario:

<code> class LodgingOfferSearchForm(forms.Form): query = forms.CharField(label='', widget=forms.TextInput())

Y la vista

LodgingOfferSearch

<code> class LodgingOfferSearch(FormView): template_name = 'hosts/lodgingoffer_search.html' form_class = LodgingOfferSearchForm() def get(self, request, *args, **kwargs): form = LodgingOfferSearchForm(self.request.GET or None) return self.render_to_response(self.get_context_data(form=form)) # We get the active object records # I think that this is not necessary ... ? def get_queryset(self): qs = LodgingOffer.objects.active() return qs def get_context_data(self, **kwargs): context = super(LodgingOfferSearch, self).get_context_data(**kwargs) user = self.request.user form = LodgingOfferSearchForm(self.request.GET or None) qs = LodgingOffer.objects.active() # We pass the results set active offer_list to template via context context['offer_list'] = qs # We ask if the form is valid, when perform a search if form.is_valid(): cd = form.cleaned_data # We get the results with from haystack.query import SearchQuerySet() # detailing query from form. results = SearchQuerySet().models(LodgingOffer)\ .filter(content=cd['query']).load_all() # Send some context variables to template total_results = results.count() context.update({ 'cd': cd, 'results':results, 'total_results': total_results, }) if user.is_authenticated(): context['userprofile'] = user.profile return context

Entonces, mi inquietud aquì, es que en mi template

lodgingoffer_search.html
yo quiero mostrar los registros ya existentes de
LodgingOffer
cuando se renderiza el template y los registros resultantes de la bùsqueda cuando efectùo alguna como tal. Acorde a esta intenciòn, tengo:

<code> <!-- We render the form input to perform the search --> <form action="." method="get"> <input type="submit" value="Buscar" class="submit-button"> <div class="formgroup"> <span></span> {{ form.query }} </div> <br /> </form> <!-- We iterate through offer_list active records existing objects --> {% for offers in offer_list %} <article class="host full-width" > <a href="{% url 'host:detail' offers.slug %}"> <div class="img-title-cont"> {% if offers.photo %} <div class="img" style="background: url('{{ offers.photo.url }}') no-repeat center; background-size:cover;"></div> {% endif %} <div class="title-cont"> <h3>{{ offers.ad_title }}</h3> </div> </div> </a> </article> {% endfor %} <!-- We ask if the query is present in the request.GET to perform search --> {% if "query" in request.GET %}<br /> <p><h3>Ofertas de alojamiento que contengan: "{{ cd.query }}"</h3></p> <span>Encontrados cerca de {{ total_results }} resultado{{ total_results|pluralize }}</span> <br /><br /> <!-- We iterate in results set from search performed --> {% for result in results %} {% with lodgingoffer=result.object %} <article class="host full-width" > <a href="{% url 'host:detail' lodgingoffer.slug %}"> <div class="img-title-cont"> {% if lodgingoffer.photo %} <div class="img" style="background: url('{{ lodgingoffer.photo.url }}') no-repeat center; background-size:cover;"></div> {% endif %} <div class="title-cont"> <h3>{{ lodgingoffer.ad_title }}</h3> </div> </div> </a> <hr/> {% endwith %} {% empty %} <p>No existen resultados para tu búsqueda de "{{ cd.query }}".</p> {% endfor %} </article> {% endif %}

El inconveniente que presento es que cuando entro al formulario que renderiza el template

lodgingoffer_search.html
yo veo los registros existentes de
LodgingOffer
y esto esta bien, es lo que quiero.

Pero cuando efectùo alguna bùsqueda en el formulario, yo obtengo, tanto los registros existentes de

LodgingOffer
, pero tambièn los resultados que coincidan con mi bùsqueda.

Entonces, si mi un resultado coincide con algun registro existente que muestro primero, entonces tendrè una duplicidad de registros a mostrar, lo mostraria dos veces.

En este enlace es posible ver el comportamiento

Como puedo mostrar los registros existentes cuando entro al template que renderiza el formulario, pero cuando efectue alguna busqueda que solo aparezcan los resultados que coincidan con dicha bùsqueda?

No hay respuestas
para escribir tu comentario
Curso de Python y Django 2016

Curso de Python y Django 2016

Aprende Python desde cero y crea tu primera aplicación web completa en Django. Entiende las bases del lenguaje, sus funciones, conoce cómo conectarte a bases de datos y termina creando una API REST de manera profesional para tu app.

Curso de Python y Django 2016
Curso de Python y Django 2016

Curso de Python y Django 2016

Aprende Python desde cero y crea tu primera aplicación web completa en Django. Entiende las bases del lenguaje, sus funciones, conoce cómo conectarte a bases de datos y termina creando una API REST de manera profesional para tu app.