2009-09-09 9 views
5

J'ai écrit le formset personnalisé suivant, mais pour la vie de moi, je ne sais pas comment sauvegarder le formulaire. J'ai recherché les documents Django et fait des recherches approfondies, mais aucune solution ne fonctionne. Beaucoup de trous de lapin, mais pas de viande ;-) Quelqu'un peut-il me diriger dans la bonne direction?Django comment enregistrer un formset personnalisé

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

Répondre

7

Dans votre Pour les formulaires personnalisés, vous devez ajouter une méthode save() qui insère les données du formulaire dans vos modèles si nécessaire. Toutes les données saisies dans le formulaire seront disponibles dans un hachage appelé clean_data [].

Par exemple:

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

Heureux il a aidé, je viens juste de commencer mon premier projet Django et de travail à travers ces questions aussi. – gbc

3

Seules les formes de modèle et les formsets sont accompagnés d'une méthode save(). Les formulaires standard n'étant pas associés aux modèles, vous devez stocker les données vous-même. How to save a formset? de la liste de diffusion Django a un exemple d'enregistrement de données à partir d'un formset normal.

Editer: Vous pouvez toujours ajouter une méthode save() à un formulaire normal ou à un formset comme le suggère gbc. Ils n'en ont tout simplement pas intégré.

je ne vois pas un modèle TeamStat dans vos extraits de code, mais si vous aviez un, votre forms.py devrait ressembler à ceci:

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) 

Voir Creating forms from models des Django docs

Questions connexes