Обновление экземпляров ModelFormset - PullRequest
1 голос
/ 24 апреля 2020

В моем приложении 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()

Если да, то не будет ли оно создавать новые записи вместо обновления старых?

1 Ответ

1 голос
/ 24 апреля 2020

Чтобы новый экземпляр также был подключен к команде, вы должны убедиться, что каждый игрок подключен к правильной команде

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-ко-многим-отношениям

Добавление второго раза в порядке, оно не будет дублировать отношение:

...