2009-09-09 8 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

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をカスタムフォームでは、必要に応じてフォームデータをモデルに埋め込むsave()メソッドを追加する必要があります。フォームに入力されたすべてのデータは、cleaned_data []と呼ばれるハッシュで利用可能になります。例えば

:それは私はちょうど私の最初のDjangoプロジェクトに開始し、また、これらの問題によって働いている、助け

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

うれしいです。 – gbc

3

モデルフォームとフォームセットのみがsave()メソッドとなります。通常のフォームはモデルに添付されていないので、データを自分で保存する必要があります。 DjangoメーリングリストのHow to save a formset?には、通常のformsetのデータを保存する例があります。

編集:通常のフォームまたはフォームセットに、save()メソッドを追加できます(gbcが示唆しているとおり)。彼らはただ1つを内蔵していません。

私はあなたのコードスニペットでTeamStatモデルが表示されていない、しかし、あなたは1を持っていた場合、あなたのforms.pyはこのようなものになります。あなたにDjangoのドキュメントから

関連する問題