Rahul Sharma
Rahul Sharma

Reputation: 2495

Update instances of ModelFormset

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?

Upvotes: 1

Views: 276

Answers (1)

bb4L
bb4L

Reputation: 919

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:

Upvotes: 1

Related Questions