2016-08-04 64 views
1

Ich habe eine FormView namens LeagueTransferView basierend auf einem Formular LigaTransferForm.Django 1.9 FormView nie erreichen get_context_data

Ich versuche, get_context_data zu überschreiben, um zusätzliche Player zum Rendern in der Vorlage hinzuzufügen.

Aber get_context_data wird nie erreicht. Es funktioniert gut in anderen Ansichten wie, DetailView, ListView, ...

Ich vermisse etwas?

Unter meiner Konfiguration

Ansicht

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 
     } 

Antwort

3

Ihr Code nie get_context_data() erreicht wird, weil Sie die get() Methode überschrieben haben und nicht den Aufruf der get_context_data() Funktion th ehe. Sie müssen die get_context_data()-Funktion zum Zeitpunkt der Übergabe von context an render() in Ihrem Code manuell aufrufen.

Anstatt dies zu tun, würde ich Ihnen vorschlagen, den folgenden Ansatz zu versuchen, anstatt get() zu überschreiben und Ihre benutzerdefinierte Antwort zurückzugeben, überschreiben Sie nur, was notwendig ist und lassen Sie Django den Rest erledigen.

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

Sie meinen so? def get(): .... context = selb.get_context_data (** kwargs) context ['form'] = form return rendern (request, self.template_name, context) – Pietro

+1

Anstatt nur zu überschreiben Was ist notwendig mit verschiedenen Methoden von Django und Rest Django bereitgestellt wird für Sie behandeln. Überprüfen Sie den [Quellcode] (https://github.com/django/django/blob/master/django/views/generic/edit.py) für 'FormView', um den Ablauf besser zu verstehen. –

+1

Jetzt habe ich wirklich verstanden, wie Django Views funktioniert: D. Der tatsächliche Fluss war mir nicht klar. Danke nochmal – Pietro