更新ModelFormset的实例 [英] Update instances of 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屋!