2009-09-09 10 views
5

Napisałem następujący niestandardowy zestaw, ale dla mojego życia nie wiem, jak zapisać formularz. Przeszukałem dokumenty Django i przeprowadziłem rozległe wyszukiwania, ale żadne rozwiązanie nie działa. Dużo króliczych dziur, ale bez mięsa ;-) Czy ktoś może wskazać mi właściwy kierunek?Django jak zapisać niestandardowy zestaw formalny

// views.py partial // 

@login_required 

def add_stats(request, group_slug, team_id, game_id, template_name = 'games/stats_add_form.html'): 

    if request.POST: 

     formset = AddStatsFormSet(group_slug=group_slug, team_id=team_id, game_id=game_id, data=request.POST) 

     if formset.is_valid(): 

      formset.save() 

      return HttpResponseRedirect(reverse('games_game_list')) 

     else: 

      formset = TeamStatFormSet(group_slug=group_slug, team_id=team_id, game_id=game_id) 

     return render_to_response(template_name, {'formset': formset,}) 


// modles.py partial // 

class PlayerStat(models.Model): 

    game = models.ForeignKey(Game, verbose_name=_(u'sport event'),) 
    player = models.ForeignKey(Player, verbose_name=_(u'player'),) 
    stat = models.ForeignKey(Stat, verbose_name=_(u'statistic'),) 
    total = models.CharField(_(u'total'), max_length=25, blank=True, null=True) 

    class Meta: 
     verbose_name = _('player stat') 
     verbose_name_plural = _('player stats') 
     db_table  = 'dfusion_playerstats' 

     def __unicode__(self): 
      return u'%s' % self.player 


// forms.py 

class TeamStatForm(forms.Form): 

    total = forms.IntegerField() 


class BaseTeamStatsFormSet(BaseFormSet): 

    def __init__(self, *args, **kwargs): 
     self.group_slug = kwargs['group_slug'] 
     self.team_id = kwargs['team_id'] 
     self.game_id = kwargs['game_id'] 
     self.extra = len(Stat.objects.filter(group__slug=self.group_slug)) 
     del kwargs['group_slug'] 
     del kwargs['game_id'] 
     del kwargs['team_id'] 
     super(BaseTeamStatsFormSet, self).__init__(*args, **kwargs) 

    def add_fields(self, form, index): 
     super(BaseTeamStatsFormSet, self).add_fields(form, index) 
     form.fields["stat"] = forms.ModelChoiceField(queryset = Stat.objects.filter(group__slug=self.group_slug)) 
     form.fields["game"] = forms.ModelChoiceField(queryset = Game.objects.all()) 
     form.fields["team"] = forms.ModelChoiceField(queryset = Team.objects.all()) 
     form.fields["game"].initial = self.game_id 
     form.fields["team"].initial = self.team_id 

TeamStatFormSet = formset_factory(TeamStatForm, BaseTeamStatsFormSet) 

Odpowiedz

7

w twojej niestandardowe formularze, musisz dodać metodę save(), która w razie potrzeby przesyła dane formularza do modeli. Wszystkie dane wprowadzone w formularzu będą dostępne w haśle o nazwie cleaned_data [].

Na przykład:

def save(self): 
    teamStat = TeamStat(game_id=self.cleaned_data['game_id'],team_id=self.cleaned_data['team_id']) 
    teamStat.save() 
    return teamStat 
+0

Cieszę się, że pomogło, ja tylko począwszy od mojego pierwszego projektu Django i pracy za pośrednictwem tych sprawach również. – gbc

3

Tylko modele formularzy i formularzy są dostarczane z metodą save(). Regularne formularze nie są dołączane do modeli, więc musisz je przechowywać samodzielnie. How to save a formset? z listy dyskusyjnej Django ma przykład zapisywania danych z regularnego zestawu.

Edycja: zawsze można dodać metodę save() do zwykłego formularza lub formularza, zgodnie z sugestią gbc. Po prostu nie mają wbudowanego.

ja nie widzę TeamStat model w swoich fragmentów kodu, ale jeśli miał jeden, twój forms.py powinien wyglądać mniej więcej tak:

class TeamStatForm(forms.ModelForm): 
    total = forms.IntegerField() 

    class Meta: 
     model = TeamStat 


class BaseTeamStatsFormSet(BaseModelFormSet): 

    def __init__(self, *args, **kwargs): 
     self.group_slug = kwargs['group_slug'] 
     self.team_id = kwargs['team_id'] 
     self.game_id = kwargs['game_id'] 
     self.extra = len(Stat.objects.filter(group__slug=self.group_slug)) 
     del kwargs['group_slug'] 
     del kwargs['game_id'] 
     del kwargs['team_id'] 
     super(BaseTeamStatsFormSet, self).__init__(*args, **kwargs) 

    def add_fields(self, form, index): 
     super(BaseTeamStatsFormSet, self).add_fields(form, index) 
     form.fields["stat"] = forms.ModelChoiceField(queryset = Stat.objects.filter(group__slug=self.group_slug)) 
     form.fields["game"] = forms.ModelChoiceField(queryset = Game.objects.all()) 
     form.fields["team"] = forms.ModelChoiceField(queryset = Team.objects.all()) 
     form.fields["game"].initial = self.game_id 
     form.fields["team"].initial = self.team_id 

TeamStatFormSet = modelformset_factory(TeamStatForm, BaseTeamStatsFormSet) 

Zobacz Creating forms from models z docs Django

Powiązane problemy