2016-08-04 3 views
1

私は、フォームLeagueTransferFormに基づいて、LeagueTransferViewというFormViewを持っています。Django 1.9 FormViewがget_context_dataに到達しない

テンプレートにレンダリングするプレーヤーを追加するために、get_context_dataをオーバーライドしようとしています。

しかし、get_context_dataには決して達しません。 DetailView、ListViewなどの他のビューで正常に動作しています...

私は何かが欠けていますか?

私の設定の下に表示

class LeagueTransferView(FormView): 
    template_name = 'hockey/league/transfer_market.html' 
    form_class = LeagueTransferForm 
    success_url = '' 

    def get_context_data(self, **kwargs): 
     print('----NEVER REACHED----') 
     context = super(LeagueTransferView, self).get_context_data(**kwargs) 
     petitioner = get_object_or_404(Team, user=self.request.user.profile, league=self.kwargs['pk']) 
     context['players'] = Player.objects.filter(leagues=self.kwargs['pk']).exclude(teams=petitioner) 
     return context 

    def get(self, request, *args, **kwargs): 
     petitioner = get_object_or_404(Team, user=self.request.user.profile, league=self.kwargs['pk']) 
     form = self.form_class(initial={'league': self.kwargs['pk'], 'petitioner': petitioner}) 
     form.fields['offered_player'].queryset = petitioner.players 
     return render(request, self.template_name, {'form': form}) 

    def post(self, request, *args, **kwargs): 
     form = self.form_class(request.POST) 
     if form.is_valid(): 
      transfer = form.save(commit=False) 
      team = Team.objects.filter(league=transfer.league, players__in=[transfer.requested_player]) 
      if not team: # free agent 
       transfer.status = 1 
       messages.success(request, _('transfer succeeded')) 
      else: 
       print(team) 
       transfer.player_owner = team[0] 
       if transfer.petitioner.user is None: # bot team 
        transfer.status = 1 
        messages.success(request, _('transfer succeeded')) 
       else: 
        messages.success(request, _('transfer waiting for confirmation by player owner')) 
      transfer.save() 
      return HttpResponseRedirect(reverse('hockey_dashboard')) 

     petitioner = get_object_or_404(Team, user=self.request.user.profile, league=self.kwargs['pk']) 
     form.fields['offered_player'].queryset = petitioner.players 
     return render(request, self.template_name, {'form': form}) 

class LeagueTransferForm(forms.ModelForm): 
    class Meta: 
     model = Transfer 
     fields = ['league', 'requested_player', 'offered_player', 'player_owner', 'petitioner'] 
     labels = { 
      'requested_player': _('Requested player'), 
      'offered_player': _('Offered player'), 
     } 
     widgets = { 
      'requested_player': forms.HiddenInput, 
      'league': forms.HiddenInput, 
      'player_owner': forms.HiddenInput, 
      'petitioner': forms.HiddenInput 
     } 

答えて

3

FORMは、あなたのコードは、あなたがget()メソッドをオーバーライドしているので、get_context_data()に到達したことがないとget_context_data()関数を呼び出していませんth ere。コード内でcontextrender()に渡すときに、get_context_data()関数を手動で呼び出す必要があります。

get()をオーバーライドしてカスタムレスポンスを返す代わりに、必要なものをオーバーライドするだけで、Djangoが残りの部分を処理するようにすることをお勧めします。

class LeagueTransferView(FormView): 
    template_name = 'hockey/league/transfer_market.html' 
    form_class = LeagueTransferForm 
    success_url = '' 

    def get_context_data(self, **kwargs): 
     context = super(LeagueTransferView, self).get_context_data(**kwargs) 
     context['players'] = Player.objects.filter(leagues=self.kwargs['pk']).exclude(teams=self.petitioner) 
     return context 

    def get_initial(self): 
     initial = super(LeagueTransferView, self).get_initial() 
     initial['league'] = self.kwargs['pk'] # add custom data to initial 
     initial['petitioner'] = self.petitioner # add custom data to initial 
     return initial 

    def get_form(self, form_class=None): 
     form = super(LeagueTransferView, self).get_form(form_class) 
     # override the queryset 
     form.fields['offered_player'].queryset = self.petitioner.players 
     return form 

    def get(self, request, *args, **kwargs): 
     # only perform 1 query to get 'petitioner' 
     self.petitioner = get_object_or_404(Team, user=self.request.user.profile, league=self.kwargs['pk']) 
     return super(LeagueTransferView, self).get(request, *args, **kwargs) 
+0

このような意味ですか? def get():.... コンテキスト= self.get_context_data(** kwargs) コンテキスト['form'] =フォーム リターンレンダリング(request、self.template_name、context) – Pietro

+1

これを行う代わりに、 Djangoが提供するさまざまなメソッドを使用して必要なものは、Djangoがあなたのために処理します。フローの理解を深めるため、[FormView]の[ソースコード](https://github.com/django/django/blob/master/django/views/generic/edit.py)をチェックしてください。 –

+1

今私はDjango Viewsの仕組みを本当に理解しています。実際の流れは私には分かりませんでした。ありがとうございました – Pietro

関連する問題