Reputation: 2495
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
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