Aplicando Django mixins y consultas con Q objects - comportamiento particular

Pregunta de la clase:
Bernardo Augusto García Loaiza

Bernardo Augusto García Loaiza

Pregunta
studenthace 7 años

Tengo el siguiente mixin en el que quiero recuperar los datos del modelo de

User
con el que trabajo para colocar estos datos en diferentes vistas basadas en clases que estoy desarrollando:

<code> class UserProfileDataMixin(object): def get_context_data(self, **kwargs): context = super(UserProfileDataMixin, self).get_context_data(**kwargs) user = self.request.user #context['userprofile'] = user.profile if user.is_authenticated(): context['userprofile'] = user.profile return context

Entonces, tengo la siguiente vista basada en clase en la cual deseo buscar usuarios acorde a la coincidencia con su

username
y
full_name
campos del modelo User que trabajo.

<code> class SearchView(UserProfileDataMixin, ListView): template_name = 'search.html' def get(self, request, *args, **kwargs): query = request.GET.get("q") qs = None if query: qs = User.objects.filter( Q(username__icontains=query) | Q(full_name__icontains=query) ) context = {"users": qs} return render(request, "search.html", context)

Cuando yo estoy heredando desde

UserProfileDataMixin
este mixin me da la posibilidad de tener la variable de contexto
userprofile
para pasarla a mi template
search.html
el cual hereda desde
layout.html
template en el cual efectuo la siguiente validación:

search.html template

<code> {% extends "layout.html" %}

layout.html template

<code> {% if userprofile %} I put the data of user by example: avatar, username, full_name, and menu options to my app. {% endif %}

Hasta aquí, todo bien, pero mi vista basada en clase

SearchView
no aplica el mixin
UserProfileDataMixin
, digo esto, porque no puedo obtener los datos de usuario sobre mi template los cuales vienen de
layout.html.

Cuando despliego la plantilla de búsqueda de usuarios, obtengo que mis datos de usuario no aparecen en el top menu o encabezado en donde deseo que aparezcan:

He cambiado ligeramente mi vista basada en clase

SearchView
sobreescribiendo el método
get_queryset
en lugar de el método
get

<code> class SearchView(UserProfileDataMixin, ListView): template_name = 'search.html' def get_queryset(self): query = self.request.GET.get("q") qs = None if query: qs = User.objects.filter( Q(username__icontains=query) | Q(full_name__icontains=query) ) context = {"users": qs} return render(self.request, "search.html", context)

Y mi vista basada en clase

SearchView
aplica el mixin
UserProfileDataMixin
porque ahora puedo obtener los datos de usuario desde
layout.html
sobre mi template de
search.html

Ahora, aparece en mi top header menu, estos datos que son los que me trae el

UserProfileDataMixin

Pero entonces, ahora, tengo el inconveniente de que mi consulta Q de buscar usuarios no funciona

¿Cuál es la razón, para que mi mixin

UserProfileDataMixin
no sea aplicado o heredado en mi vista basada en clase
SearchView
cuando sobreescribo el método
get
, pero sí cuando sobreescribo el método
get_queryset
?

¿Por qué esto elimina el efecto de mi consulta Q ? ¿Cuándo debería usar

get
y cuándo usar
get_queryset
?

En este post, hay una respuesta muy ilustrativa y acorde a ello, pienso que el metodo

get_queryset
es la mejor opción para mi caso, pero no se que estoy haciendo mal que mi consulta con el objeto Q de búsqueda de usuarios no es ejecutada del todo bien.

Por qué con

get_queryset
mi consulta no es ejecutada de la misma manera como cuando uso
get
?

No hay respuestas
para escribir tu comentario
Curso de Django online | David Toca | 2017

Curso de Django online | David Toca | 2017

En el curso de Django aprenderás a desarrollar aplicaciones de una forma rápida, en este curso veremos el desarrollo de un e-commerce haciendo uso de todas las herramientas que este framework posee.

Curso de Django online | David Toca | 2017
Curso de Django online | David Toca | 2017

Curso de Django online | David Toca | 2017

En el curso de Django aprenderás a desarrollar aplicaciones de una forma rápida, en este curso veremos el desarrollo de un e-commerce haciendo uso de todas las herramientas que este framework posee.