2013-02-19 16 views
20

Ich versuche eine klassenbasierte Ansicht aufzurufen und ich kann es tun, aber aus irgendeinem Grund bekomme ich nicht den Kontext der neuen Klasse, die ich rufeDjango Call Klassenbasierte Ansicht von einer anderen Klassen basierten Ansicht

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) 

Was mache ich falsch Leute?

+1

zu tun hatte, was diese tun werden soll? Was erhoffen Sie sich zu erreichen, indem Sie einfach diese Ansicht aufrufen? Ich denke, Sie müssen wahrscheinlich das Ergebnis des Aufrufs zurückgeben, aber da 'compute_context' eine nicht standardisierte Methode ist, ist es schwer sicher zu sein. –

+0

ich bin irgendwie "erfrischend" meine Seite, so dass ich meine vorherige Seite mit einigen neuen Kontextdaten zurückrufe – psychok7

+0

Ich gebe zurück self.render_to_response (self.compute_context (Anfrage, Benutzername)) – psychok7

Antwort

38

Statt

ShowAppsView.as_view()(self.request) 

ich diese

return ShowAppsView.as_view()(self.request) 
+4

Ich fand, dass, wenn Sie tun ShowAppsView.as_view() (Anfrage, * args, ** kwargs) es ist tatsächlich möglich, die args und kwargs bis zur get_context_data Methode mit dem ContextMixin zu bekommen, wo sie als Selbst erscheinen .args und self.kwargs. Dies ist sehr nützlich, um diese Methode zu überschreiben und dem Kontext beispielsweise für ein Formular hinzuzufügen. – Sven

+0

Ich finde das ist auch in Funktionsansichten nützlich. Mit dem oben genannten Code kann ich die klassenbasierte Ansicht aus Funktionsansichten aufrufen. –

1

Die Dinge werden komplizierter, wenn Sie beginnen, multiple inheritance in Python zu verwenden, so dass Sie leicht Ihren Kontext mit dem von einem geerbten Mixin trampeln könnten.

Sie sagen nicht genau, welchen Kontext Sie bekommen und welchen Sie wollen (Sie definieren keinen neuen Kontext), so dass es schwierig ist, vollständig zu diagnostizieren, aber versuchen Sie, die Reihenfolge Ihrer Mixins neu zu ordnen;

class ShowAppsView(LoginRequiredMixin, CurrentUserIdMixin, TemplateView): 

bedeutet dies, dass LoginRequiredMixin wird die erste Klasse von erben, und so wird es Vorrang vor den anderen zu nehmen, wenn es das Attribut hat für Sie suchen - wenn es dann nicht hat, wird Python aussehen in CurrentUserIdMixin und so weiter.

Wenn Sie wirklich sicher sein wollen, dass Sie den Kontext, die Sie nach sind, könnten Sie eine Überschreibung wie

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

, um sicherzustellen, hinzufügen, dass der Kontext, den Sie erhalten, ist die eine von der mixin, dass Sie wollen.

* Edit * Ich weiß nicht, wo Sie compute_context gefunden haben, aber es ist kein django Attribut, so wird nur von ShowAppsView.get() und nie in ManageAppView aufgerufen.

+0

Ich habe meinen Code oben bearbeitet und den compute_context herausgenommen, aber es funktioniert immer noch nicht. Soll ich ManageAppView von ShowAppSview erben, um auf die Methode zuzugreifen? – psychok7

+0

dito @Daniel Roseman Wenn 'compute_context' das ist, was Sie zurückgeben wollen, brauchen Sie es. Es ist nicht Standard, also sollte es in 'get_context' oder ähnlich sein. Ich bot keine vollständige Reparatur an, sondern eine Route zur Erkundung/Untersuchung. – danodonovan

Verwandte Themen