Django 1.9 FormView永远不会到达get_context_data

时间:2016-08-04 18:25:52

标签: python django django-forms django-views

我有一个名为LeagueTransferView的FormView,基于一个表格LeagueTransferForm。

我正在尝试覆盖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})

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
        }

1 个答案:

答案 0 :(得分:3)

您的代码永远不会到达get_context_data(),因为您已覆盖get()方法而未在此处调用get_context_data()函数。您需要在代码中将get_context_data()传递给context时手动调用render()函数。

我建议你尝试以下方法,而不是覆盖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)