Skip to content

Instantly share code, notes, and snippets.

@bgarcial
Last active October 2, 2018 16:56
Show Gist options
  • Save bgarcial/a71caab2968851433bfb3ad1131eb603 to your computer and use it in GitHub Desktop.
Save bgarcial/a71caab2968851433bfb3ad1131eb603 to your computer and use it in GitHub Desktop.
Using Mixin and Q objects with get_context_data
class SearchView(UserProfileDataMixin, ListView):
template_name = 'search.html'
model = get_user_model()
def get_context_data(self, **kwargs):
query = self.request.GET.get("q")
qs = None
if query:
qs = User.objects.filter(
Q(username__icontains=query) |
Q(full_name__icontains=query)
)
context = super(SearchView, self).get_context_data(**kwargs)
context["users"] = qs
return context
@sshgun
Copy link

sshgun commented Jun 10, 2018

Eso funciona pero el pero creo que estas escribiendo de mas. como te explique en stackoverflow. no necesitas incluir directamente tu los users en el contexto ya la clase genérica lo hace por ti.

    def get_context_data(self, *, object_list=None, **kwargs):
        """Get the context for this view."""
        # aqui django vefica si el object_list fue fijado. y lo hace en el metodo get
        queryset = object_list if object_list is not None else self.object_list 
        page_size = self.get_paginate_by(queryset)
        context_object_name = self.get_context_object_name(queryset)
        if page_size:
            paginator, page, queryset, is_paginated = self.paginate_queryset(queryset, page_size)
            context = {
                'paginator': paginator,
                'page_obj': page,
                'is_paginated': is_paginated,
                'object_list': queryset
            }
        else:
            context = {
                'paginator': None,
                'page_obj': None,
                'is_paginated': False,
                'object_list': queryset
            }

        # Y aqui si especificas el context_object_name, la clase lo agrega al contexto.
        if context_object_name is not None:
            # si especificaste  el context_object_name como 'users' tendrias ese elemento en el contexto de tu template.
            context[context_object_name] = queryset
        context.update(kwargs)
        return super().get_context_data(**context)
class TestView(ListView):
    model = get_user_model()
    template_name = 'search.html'
    context_object_name = 'users'

    def get_queryset(self):
        q = self.request.GET.get('q')
        qs = None
        if q:
            qs = User.objects.filter(Q(username__icontains=query) |Q(full_name__icontains=query))
        return qs

bueno aunque si ya te funciona podrias dejarlo como lo tienes, pero es menos "elegante" xD

@bgarcial
Copy link
Author

bgarcial commented Oct 2, 2018

@Gytree, primero muchas gracias por revisar esto, no había visto que me habias escrito en este gist, por lo cual ofrezco disculpas por la tardanza.

Entiendo lo que me dices del contexto el cual ya viene especificado en el método del get_context_data() que indicas arriba.
Mi pregunta ahora es:

Ese método del get_context_data() que indicas arriba es el código genérico que se ejecuta cuando uno heredad de la clase ListView?
En caso afirmativo, es por ello que el query con los objetos Q lo procedes a realizar con el método get_queryset()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment