Django1.9formview永远无法访问get\u context\

2024-10-03 23:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个窗体视图叫做LeagueTransferView,它基于一个窗体LeagueTransferForm。在

我正在尝试覆盖get_context_data以添加额外的播放器以在模板中呈现。在

但是,get_context_数据从未到达。它可以很好地处理其他视图,比如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})

表格

^{pr2}$

Tags: selfformgetrequestcontextteamkwargsclass
1条回答
网友
1楼 · 发布于 2024-10-03 23:22:51

您的代码永远不会到达get_context_data(),因为您重写了get()方法,而没有在那里调用get_context_data()函数。在代码中将context传递给render()时,需要手动调用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)

相关问题 更多 >