【问题标题】:Update instances of ModelFormset更新 ModelFormset 的实例
【发布时间】:2020-04-24 14:40:49
【问题描述】:

在我的 django 应用程序中,两个模型通过 manytomany 关系连接,我正在使用 modelformset_fatory 创建这样的表单

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 实例时,它不会被保存。

更新功能:

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

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

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

如果是,那么它不会创建新条目而不是更新旧条目吗?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

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

    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

    添加第二次就可以了,不会重复关系:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多