更新ModelFormset的实例 [英] Update instances of ModelFormset

查看:85
本文介绍了更新ModelFormset的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的django应用程序中,两个模型通过 manytomany 关系进行连接,并且我正在使用 modelformset_fatory 创建类似

In my django app two models are connecetd by manytomany relation and I am using modelformset_fatory to create a form like this

Views.py

def post(request):
    tform = TeamForm()
    pform = modelformset_factory(Player, form=PlayerForm, extra = 1)
    pform = pform(request.POST or None, queryset = Player.objects.filter(id__isnull = True))
    if request.method == 'POST':
        t = Team()
        tform = TeamForm(request.POST, instance=t)
        if tform.is_valid() and pform.is_valid():
            tform.save()
            instances = pform.save(commit=False)
            for i in instances:
                player = Player()
                player.pname = i.pname
                player.hscore = i.age
                player.age = i.hscore
                player.save()
                t.player.add(player)
            t.save()
            return redirect('/exams/dashboard/')
        else:
            print('invalid data')
    return render(request, 'team/team_create.html', {'exform': tform, 'exformset': pform})

这工作得很好,但是当我尝试时会出现问题要更新表单,我可以使用数据初始化表单,但是当我在表单中创建新的 player 实例时,它不会保存。

This is working perfectly fine but the problem occurs when I try to update the form, I am able to initialize the form with the data but when I create a new player instance in form it does not get saved.

更新功能:

def update(request, pk = None):
    team = Team.objects.get(id = pk)
    tform = TeamForm(instance = team)
    pform = modelformset_factory(Player, form=PlayerForm, extra=0)
    print("players", Player.objects.filter(team=team))
    pform = pform(request.POST or None, queryset=Player.objects.filter(team=team))
    if request.method == 'POST':
        tform = TeamForm(request.POST, instance=team)
        print("tform ", tform)
        print("pform ", pform)
        if tform.is_valid() and pform.is_valid():
            tform.save()
            pform.save()
            return redirect('/exams/dashboard/')
        else:
            print('invalid data')
    return render(request, 'team/team_create.html', {'exform': tform, 'exformset': pform})

我是否必须重写以下内容:

Do I have to rewrite the following:

instances = pform.save(commit=False)
            for i in instances:
                player = Player()
                player.pname = i.pname
                player.hscore = i.age
                player.age = i.hscore
                player.save()
                t.player.add(player)
            t.save()

如果是,那么它是否会创建新的肠子而不是是更新旧版本吗?

If yes, then wouldn't it create new enteries rather than updating the old ones?

推荐答案

要将新实例也连接到团队yo您必须确保每个玩家都连接到正确的团队

To have the new instance also connected to the team you have to ensure every player is connected to the correct team

instances = pform.save() # save all the players in the modelformset 
for i in instances:
    t.player.add(i) # ensure every player is connected to the team

,如此处所述: https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/#many-to-many-relationships


第二次添加是可以的,不会重复以下关系:

Adding a second time is OK, it will not duplicate the relation:

这篇关于更新ModelFormset的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆