2017-09-06 3 views
0

現実的なチェックを実行して、使用するテンプレートファイルを決定する方法が不思議です。 AgencyFullViewからagency_countにアクセスするにはどうすればよいですか?私は現在、型オブジェクトリターンを持って何AgencyFullMixinは、 "あなたが別の方法でagency_countにアクセスしたい場合、あなたは属性として設定する必要があります何の属性「agency_count」継承されたクラスベースのビューで変数にアクセスする方法

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

コードAgencyFullViewにクラスのボディに右に書かれているように見えます。それは事実ですか?また、mixinクラスにも 'agency_count'変数がないようです。あなたは' agency_count_test'を持っています。 'agency_count_test'はローカル変数であり、get_context_data()メソッドが返ったらそれはなくなります。 –

+0

要求に応じてのみ計算されるものに基づいて、クラスレベルでテンプレートを設定しようとしています。これはうまくいきません。あなたの 'if agency_count!= 0'コードはアプリケーションの起動時に一度だけ実行され、すべての要求に対して実行されることはないので、このカウントを使用することはできません。 –

+0

@Mad Wombat _test typoを削除しました – Fish

答えて

0

:ここで私が使用していますソリューションです:

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

を持っていません。あなたはディスパッチメソッドでこれを行うことができます。

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 

他の方法ではself.agency_countにアクセスできます。テンプレート名を動的に変更するには、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

次のエラーが表示されます。 'super'オブジェクトには属性 'get'がありません。 この行はエラーをスローしています。 return super(AgencyFullMixin、self).get(request、* args、** kwargs) – Fish

+0

クラスの順序を変更してみてください。 – Alasdair

関連する問題