Создание объекта 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, происходят две неожиданные вещи:

  1. The post() method appears to be being called is called twice
  2. the Question object is getting created before the form.is_valid() method call

Почему это происходит, и как это исправить?

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