Могу ли я использовать стандартный общий CreateView для набора форм модели?

Я снова застрял с набором форм модели. У меня есть следующая форма:

ArticleFormSet = modelformset_factory(Article, fields=('title', 'pub_date'), extra=3)

и View для этого набора форм модели:

class ArticleCreateView(CreateView):
   model = Article
   form_class = ArticleFormSet
   template_name = 'article_form_view.html'
   success_url = "/"

Читать документацию здесь: https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#model-formsets. Я понимаю, что могу использовать ArticleFormSet вместо стандартной формы для атрибута form_class.

По сути, я ожидаю, что это должно отображать 3 формы для одной модели статьи, и я должен иметь возможность создать три статьи одновременно.

Но я получаю "TypeError: init() получил неожиданный аргумент ключевого слова 'instance' ".

Вопрос в том, так ли это должно работать? Или какой правильный способ создания нескольких статей одновременно?

Я не думаю, что общий CreateView по умолчанию способен работать с наборами форм; однако, должно быть проще настроить представление так, чтобы оно работало так, как вы задумали.

Из того, что я вижу, исключение возникает, когда представление пытается создать форму для рендеринга. Поэтому требуется переопределение метода get_form:

class ArticleCreateView(CreateView):

...

   def get_form(self):
        if self.request.method == 'POST':
            return self.form_class(self.request.POST)

        return self.form_class()

Метод либо возвращает modelformset в том виде, в котором он был создан фабрикой (в случае вызова formset), либо заполняет его размещенными вами данными.

Еще одна проблема связана с success_url. Вы получите исключение при использовании набора форм. Поэтому вам нужно переопределить этот метод, например

...
    def get_success_url(self):
        return self.success_url 

Теперь это должно работать.

Однако: Если я правильно вас понял, вы хотите, чтобы представление использовалось для создания новых данных. Фабрика `` modelformset_factory`` собирает все экземпляры вашей модели и добавляет 3 пустые формы. Это может быть не то, что вы хотите. Для того, чтобы получить пустой набор форм посмотрите на этот пост SO:

Пустой ModelFormset в Django's FormWizard

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