2009-09-09 76 views
5

我寫了下面的自定義表單集,但對我的生活,我不知道如何保存表單。我搜索了Django文檔並進行了大量搜索,但沒有任何一個解決方案可行。大量的兔子洞,但沒有肉;-)有人可以指出我在正確的方向嗎?的Django如何保存自定義表單集

// 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) 

回答

7

在你自定義表單,你需要根據需要添加充塞表單數據的save()方法到您的機型。所有在表格中輸入的數據都可以在一個名爲cleaned_data []的散列中找到。

例如:

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

高興它的幫助下,我剛開始我的第一個Django項目,並通過這些問題的工作也。 – gbc 2009-09-15 12:57:37

3

只有模型窗體和窗體集帶有save()方法。常規形式不附加到模型,所以你必須自己存儲數據。 How to save a formset?從Django的郵件列表有從一個普通表單集保存數據的一個例子。

編輯:您可以隨時添加一個save()方法爲常規窗體或formset爲GBC建議。他們只是沒有內置的。

我沒有看到你的代碼片段TeamStat模式,但如果你有一個,你應該forms.py看起來是這樣的:

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) 

Creating forms from models從Django文檔

相關問題