Создание объекта Django из формы с вложенными элементами - ведет себя не так, как ожидалось
Я использую Django 3.2
Я пытаюсь создать объект, который имеет дочерние элементы (без использования наборов форм). Я использовал Javascipt для создания удобного пользовательского интерфейса, который позволяет пользователю динамически добавлять дочерние элементы.
Метод post класса обработчика маршрута анализирует поля POST и извлекает дочерние элементы.
Это упрощенная версия моей кодовой базы:
/path/to/myapp/models.py
class Question(models.Model):
title = models.CharField(max_length=64)
start_date = models.DateTime()
end_date = models.DateTime()
class Choice(models.Model):
title = models.CharField(max_length=64)
pos = models.PositiveSmallInteger(default=0)
question = models.ForeignKey(Question, on_delete=models.CACSCADE, related_name='choices')
/path/to/myapp/forms.py
class QuestionForm(forms.ModelForm):
def clean(self):
cleaned_data = super().clean()
start_date = cleaned_data['start_date']
end_date = cleaned_data['end_date']
if end_date <= start_date:
self.add_error('end_date', ValidationError(_('End date must be greater than the start date'), code=_('invalid_date')))
class Meta:
model = Question
/path/to/myapp/views.py
class QuestionCreateView(CreateView):
model = Question
form_class = QuestionForm
def post(self, request, *args, **kwargs):
post_data = request.POST
question_choice_data = [x.split('-') for x in post_data.get('question_choices','').split(',')] # <- object is sometimes created on this line!
form = self.form_class(post_data)
if form.is_valid():
new_question = form.save(commit=False)
# set some field attributes
# ...
new_question.save()
for position, choice_name in question_choice_data:
Choice.objects.create(question=new_question, title=choice_name, pos=int(position))
Когда я пытаюсь сохранить новый вопрос через POST, происходят две неожиданные вещи:
- The
post()
method appears to be being called is called twice - the Question object is getting created before the form.is_valid() method call
Почему это происходит, и как это исправить?