Как создать единую форму для двух моделей, связанных внешним ключом?

Я разработал систему голосования, используя Python и Django. Я хотел бы, чтобы пользователь мог регистрировать новые опросы. Однако, когда пользователь регистрирует новый опрос, возникает ошибка IntegrityError. Похоже, что он не может получить ID первой модели. Как исправить эту ошибку? Фотография ошибки и формы ниже...

models.py

from django.db import models
from django.utils import timezone


class Question(models.Model):
     question_text = models.CharField(max_length=200)
     pub_date = models.DateTimeField(default=timezone.now, verbose_name='Date')
     show = models.BooleanField(default=True)

    def __str__(self):
        return self.question_text

class Choice(models.Model):
     question = models.ForeignKey(Question, on_delete=models.CASCADE)
     choice_text = models.CharField(max_length=200)
     votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

forms.py

 from django.forms import ModelForm

 from .models import *


 class addPollsForm(ModelForm):
     class Meta:
         model = Question
         fields = ['question_text', 'pub_date', ]

 class addChoiceForm(ModelForm):
     class Meta:
         model = Choice
         fields = ['choice_text']

views.py

def addPollsPage(request):

    if request.user.is_authenticated:
        formAddPolls = addPollsForm()
        formAddChoice = addChoiceForm()
    
        if request.method == 'POST':
            formAddPolls = addPollsForm(request.POST)
            formAddChoice = addChoiceForm(request.POST)
        
            if formAddPolls.is_valid():
                formAddPolls.save()
            if formAddChoice.is_valid():
                formAddChoice.save() 
        
            return redirect('votacao:index')

        context = {'formAddPolls': formAddPolls,
                   'formAddChoice': formAddChoice,
                  }
        return render (request, 'votacao/addPolls.html', context)

    else:
        return redirect('main')

addPolls.html

    <form action="" method="POST">
            {% csrf_token %}
            {{formAddPolls.as_p}}
            {{formAddChoice.as_p}}
            {{formAddChoice.as_p}}
            {{formAddChoice.as_p}}
            <br>
       <input type="submit" name="Submit">
    </form>

IntegrityError error photo

Проблема здесь в том, что форма addChoiceForm не имеет назначенного вопроса. Поэтому вам нужно добавить его вручную.

if formAddPolls.is_valid():
    question = formAddPolls.save()
if formAddChoice.is_valid():
    formAddChoice.question=question
    formAddChoice.save()

Вы можете посмотреть также inlineformset_factory. Проверьте это в docs и вот example.

Вернуться на верх