Update instances of ModelFormset

筅森魡賤 提交于 2020-05-16 01:21:08

问题


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

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.

Update function:

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?


回答1:


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

as described here: 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:



来源:https://stackoverflow.com/questions/61410946/update-instances-of-modelformset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!