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
.