2017-09-06 2 views
0

Je me demande comment exécuter une vérification de la réalité pour décider quel fichier gabarit utiliser. Comment puis-je accéder à agency_count à partir de AgencyFullView? Ce que j'ai actuellement des rendements type d'objet « AgencyFullMixin » n'a pas d'attribut « agency_count »Comment accéder à une variable dans les vues basées sur les classes héritées

class AgencyFullMixin(ContextMixin): 

    def get_context_data(self, pk, **kwargs): 
     context_data = super(AgencyFullMixin, self).get_context_data(**kwargs) 
     agency = Agencies.objects.filter(pk=pk) 
     context_data["agency"] = agency 
     agency_count = agency.count() 
     context_data["agency_count"] = agency_count 
     return context_data 

class AgencyFullView(TemplateView, AgencyFullMixin): 

    if agency_count != 0: **<<<--- What to put here?** 
     template_name = 'community_information_database/agency_full.html' 
    else: 
     template_name = 'community_information_database/not_valid.html' 

    def get_context_data(self, **kwargs): 
     context_data = super(AgencyFullView, self).get_context_data(**kwargs) 
     return context_data 
+0

Le code AgencyFullView semble être écrit à droite dans le corps de la classe. Est-ce vraiment le cas? De plus, il semble qu'il n'y ait pas de variable 'agency_count' dans la classe mixin, vous avez' agency_count_test'. Rappelez-vous que 'agency_count_test' est une variable locale qui disparaîtra une fois que la méthode get_context_data() sera retournée. –

+0

Vous essayez de définir votre modèle au niveau de la classe en fonction de quelque chose qui ne sera calculé que sur demande. Ça ne va pas marcher. Votre code 'if agency_count! = 0' ne s'exécutera qu'une seule fois au démarrage de l'application, pas pour chaque requête et ne pourra donc pas utiliser ce compte. –

+0

@Mad Wombat J'ai supprimé la typo _test – Fish

Répondre

0

fixe: Voici la solution que je utilise:

class AgencyFullMixin(ContextMixin): 

    def get_context_data(self, pk, **kwargs): 
     context_data = super(AgencyFullMixin, self).get_context_data(**kwargs) 
     agency = Agencies.objects.filter(pk=pk) 
     context_data["agency"] = agency 
     agency_count = agency.count() 
     context_data["agency_count"] = agency_count 
     return context_data 

class AgencyFullView(TemplateView, AgencyFullMixin): 
    def get_template_names(self, **kwargs): 
     agency = Agencies.objects.filter(pk=self.kwargs['pk']).filter(pk__isnull=False) 
     if agency: 
      return 'community_information_database/agency_full.html' 
     else: 
      return 'community_information_database/not_valid.html' 

    def get_context_data(self, **kwargs): 
     context_data = super(AgencyFullView, self).get_context_data(**kwargs) 
     return context_data 
1

Si vous souhaitez accéder agency_count dans une autre méthode, vous devrez définir comme un attribut. Vous pouvez le faire dans la méthode de répartition.

class AgencyFullMixin(ContextMixin): 
    def dispatch(self, request, *args, **kwargs): 
     agencies = Agencies.objects.filter(pk=self.kwargs['pk']) 
     self.agency_count = agencies.count() 
     return super(AgencyFullMixin, self).dispatch(request, *args, **kwargs) 

    def get_context_data(self, **kwargs): 
     """ 
     Add the agency count to the context 
     """ 
     context = super(AgencyFullMixin, self).get_context_data(**kwargs) 
     context['agency_count'] = self.agency_count 
     return context 

Vous pouvez ensuite accéder à self.agency_count dans d'autres méthodes. Pour modifier dynamiquement le nom du modèle, vous devez remplacer get_template_names.

class AgencyFullView(AgencyFullMixin, TemplateView): 
    def get_template_names(self): 
     if self.agency_count != 0: 
      template = 'community_information_database/agency_full.html' 
     else: 
      template = 'community_information_database/not_valid.html' 
     return [template] # nb get_template_names must return a list 
+0

Je reçois l'erreur suivante: l'objet 'super' n'a pas d'attribut 'get'. Cette ligne lance l'erreur: return super (AgencyFullMixin, self) .get (demande, * args, ** kwargs) – Fish

+0

Essayez de changer l'ordre de vos cours. – Alasdair