vistas urls tutorial template genericas clases basadas python django django-class-based-views

python - urls - vistas basadas en clases django



Vista basada en Django Call Class desde otra vista basada en clase (2)

Intento llamar a una vista basada en clase y puedo hacerlo, pero por alguna razón no obtengo el contexto de la nueva clase a la que llamo

class ShowAppsView(LoginRequiredMixin, CurrentUserIdMixin, TemplateView): template_name = "accounts/thing.html" @method_decorator(csrf_exempt) def dispatch(self, *args, **kwargs): return super(ShowAppsView, self).dispatch(*args, **kwargs) def get(self, request, username, **kwargs): u = get_object_or_404(User, pk=self.current_user_id(request)) if u.username == username: cities_list=City.objects.filter(user_id__exact=self.current_user_id(request)).order_by(''-kms'') allcategories = Category.objects.all() allcities = City.objects.all() rating_list = Rating.objects.filter(user=u) totalMiles = 0 for city in cities_list: totalMiles = totalMiles + city.kms return self.render_to_response({''totalMiles'': totalMiles , ''cities_list'':cities_list,''rating_list'':rating_list,''allcities'' : allcities, ''allcategories'':allcategories}) class ManageAppView(LoginRequiredMixin, CheckTokenMixin, CurrentUserIdMixin,TemplateView): template_name = "accounts/thing.html" def compute_context(self, request, username): #some logic here if u.username == username: if request.GET.get(''action'') == ''delete'': #some logic here and then: ShowAppsView.as_view()(request,username)

¿Qué estoy haciendo mal chicos?


En lugar de

ShowAppsView.as_view()(self.request)

Tuve que hacer esto

return ShowAppsView.as_view()(self.request)


Las cosas se complican más cuando empiezas a usar la herencia múltiple en Python, por lo que fácilmente puedes pisotear tu contexto con eso de una mezcla heredada.

No dices exactamente qué contexto estás obteniendo y cuál quieres (no estás definiendo un nuevo contexto), por lo que es difícil de diagnosticar completamente, pero intenta reorganizar el orden de tus mixins;

class ShowAppsView(LoginRequiredMixin, CurrentUserIdMixin, TemplateView):

esto implica que LoginRequiredMixin será la primera clase en heredarse, y por lo tanto tendrá prioridad sobre los demás si tiene el atributo que está buscando - si no lo ha hecho, python buscará en CurrentUserIdMixin y así sucesivamente.

Si desea estar realmente seguro de que obtiene el contexto que está buscando, puede agregar una anulación como

def get_context(self, request): super(<my desired context mixin>), self).get_context(request)

para asegurarte de que el contexto que obtienes sea el del mixin que deseas.

* Editar * No sé dónde ha encontrado compute_context pero no es un atributo django, por lo que solo será llamado desde ShowAppsView.get() y nunca en ManageAppView .