0

Listando objetos existentes y resultados de busqueda en Django

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

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

Este es el modelo LodgingOffer

<code>
defget_images_search_path(instance, filename):return'/'.join(['lodging_offer_images', instance.slug, filename])

classLodgingOffer(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>
classLodgingOfferSearchForm(forms.Form):
    query = forms.CharField(label='', widget=forms.TextInput())

Y la vista LodgingOfferSearch

<code>
classLodgingOfferSearch(FormView):
    template_name = 'hosts/lodgingoffer_search.html'

    form_class = LodgingOfferSearchForm()

    defget(self, request, *args, **kwargs):
        form = LodgingOfferSearchForm(self.request.GET orNone)
        return self.render_to_response(self.get_context_data(form=form))

    # We get the active object records# I think that this is not necessary ... ?defget_queryset(self):
        qs = LodgingOffer.objects.active()
        return qs

    defget_context_data(self, **kwargs):
        context = super(LodgingOfferSearch, self).get_context_data(**kwargs)
        user = self.request.user
        form = LodgingOfferSearchForm(self.request.GET orNone)
        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 searchif 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 --><formaction="."method="get"><inputtype="submit"value="Buscar"class="submit-button"><divclass="formgroup"><span></span>{{ form.query }}</div><br /></form><!-- We iterate through offer_list active records existing objects -->{% for offers in offer_list %}<articleclass="host full-width" ><ahref="{% url 'host:detail' offers.slug %}"><divclass="img-title-cont">{% if offers.photo %}<divclass="img"style="background: url('{{ offers.photo.url }}') no-repeat center; background-size:cover;"></div>{% endif %}<divclass="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 %}<articleclass="host full-width" ><ahref="{% url 'host:detail' lodgingoffer.slug %}"><divclass="img-title-cont">{% if lodgingoffer.photo %}<divclass="img"style="background: url('{{ lodgingoffer.photo.url }}') no-repeat center; background-size:cover;"></div>{% endif %}<divclass="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?

Escribe tu comentario
+ 2