2009-09-09 15 views
5

He escrito el siguiente formset personalizado, pero durante mi vida no sé cómo guardar el formulario. He buscado en los documentos de Django y he realizado búsquedas exhaustivas, pero ninguna solución funciona. Muchos agujeros de conejo, pero no carne ;-) ¿Puede alguien señalarme en la dirección correcta?Django cómo guardar un formset personalizado

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

Respuesta

7

En su formularios personalizados, deberá agregar un método save() que incluya los datos del formulario en sus modelos según sea necesario. Todos los datos ingresados ​​en el formulario estarán disponibles en un hash llamado cleaned_data [].

Por ejemplo:

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

Estamos encantados de que ayudó, estoy empezando en mi primer proyecto de Django y trabajar a través de estas cuestiones también. – gbc

3

Sólo modelos de formularios y formsets vienen con un método save(). Los formularios regulares no están adjuntos a los modelos, por lo que debe almacenar los datos usted mismo. How to save a formset? de la lista de correo de Django tiene un ejemplo de guardar datos de un formset regular.

Editar: Siempre puede agregar un método save() a un formulario regular o formset como lo sugiere gbc. Simplemente no tienen una incorporada.

no veo un modelo TeamStat en sus fragmentos de código, pero si tuviera uno, su forms.py debería ser algo como esto:

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) 

Ver Creating forms from models de la documentación de Django

Cuestiones relacionadas