Как создать единую форму для двух моделей, связанных внешним ключом?
Я разработал систему голосования, используя 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>
Проблема здесь в том, что форма addChoiceForm не имеет назначенного вопроса. Поэтому вам нужно добавить его вручную.
if formAddPolls.is_valid():
question = formAddPolls.save()
if formAddChoice.is_valid():
formAddChoice.question=question
formAddChoice.save()
Вы можете посмотреть также inlineformset_factory
. Проверьте это в docs и вот example.