Могу ли я использовать стандартный общий 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: