【问题标题】:Empty formset passing validation but not saving records空表单集通过验证但不保存记录
【发布时间】:2014-12-30 02:30:45
【问题描述】:

我的设置涉及创建游戏实例和与游戏绑定的团队的表单。与游戏相关的一组团队被输入到名为 GameTeamsFormset 的表单集中。

我的问题是,有时 GameTeamsFormset 中的字段为空,应该在我的数据库中创建空记录(是的,我想要这个)但是即使表单集通过验证,实际上也没有创建记录我可以通过管理员手动添加这些空记录。 (嗯,它们并不完全是空的,因为它们有一个将它们绑定到 Game 实例的外键)。那么,如何让我的视图保存表单集中每个空表单的记录?

Views.py

def addGame(request, league_id):
    if request.method == 'POST':

        league = League.objects.get(pk = league_id) # get the league object
        gameform = GameForm(request.POST) # initialize gameform with the POST data
        if gameform.is_valid():
            newgame = gameform.save(commit=False)
            newgame.league = league # set the league

            gameteamsform = GameTeamsFormset(request.POST, instance=newgame)
            if gameteamsform.is_valid():
                newgame.save() # save the game
                gameteamsform.save()
                return editleague(request, league_id)

            else:
                return HttpResponseRedirect("/") #needs fixin
        else:
            return HttpResponseRedirect("/") #needs fixin
    else:
        return HttpResponseRedirect("/") #needs fixin

Forms.py

class GameForm(ModelForm):
    class Meta:
        model = Game
        fields = ['game_heading', 'game_date', 'game_time']
        widgets = {
            'game_heading':TextInput(attrs={'type':'text', 'class':'form-control input-md'}),
            'game_date':TextInput(attrs={'type':'date', 'class':'form-control'}),
            'game_time':TextInput(attrs={'type':'time', 'class':'form-control'}),
        }


GameTeamsFormset = inlineformset_factory(Game, GameTeams, extra=2,
    fields=['team', 'placed', 'score'],
    widgets={'team': Select(attrs={'class':'form-control'}),
             'placed': Select(attrs={'class':'form-control'}),
             'score': TextInput(attrs={'class':'form-control'})},
    )

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    FormSet 旨在忽略空记录。您必须单独保存(并且可能设置相关密钥)。

    所以在您的邮政编码中:

    if request.POST:
        forms_factory = modelformset_factory(...)
        forms = forms_factory(request.POST)
        if forms.is_valid():
            for form in forms:
                form.instance.game = newgame
                form.save()
    

    我相信这也会遍历返回的空白表单。

    def addGame(request, league_id):
        if request.method == 'POST':
    
            league = League.objects.get(pk = league_id) # get the league object
            gameform = GameForm(request.POST) # initialize gameform with the POST data
            if gameform.is_valid():
                newgame = gameform.save(commit=False)
                newgame.league = league # set the league
    
                gameteamsform = GameTeamsFormset(request.POST, instance=newgame)
                if gameteamsform.is_valid():
                    newgame.save() # save the game
                    for gameteam in gameteamsform:
                        gameteam.game = newgame
                        gameteam.save()
                    gameteamsform.save()
                    return editleague(request, league_id)
    
                else:
                    return HttpResponseRedirect("/") #needs fixin
            else:
                return HttpResponseRedirect("/") #needs fixin
        else:
            return HttpResponseRedirect("/") #needs fixin
    

    【讨论】:

      猜你喜欢
      • 2013-04-07
      • 2018-12-08
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多