Проверьте форму и наборы форм с помощью Django - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь настроить проверку формы в своем виде, и я хотел бы получить от вас помощь, потому что у меня небольшая проблема.

Это мой набор форм:

DocumentFormSet = inlineformset_factory(Publication, Document, form=DocumentForm, extra=1, max_num=4, can_delete=True)

Это мой код:

def get_context_data(self, **kwargs):
    context = super(PublicationCreateView, self).get_context_data(**kwargs)
    document_queryset = Document.objects.all()
    context['FormSets'] = DocumentFormSet(self.request.POST or None, self.request.FILES or None,
                                                  prefix='doc', queryset=document_queryset)
    return context

def form_valid(self, form):
    try:
        context = self.get_context_data()
        formsets = context['FormSets']
        if form.is_valid():
            self.object = form.save(commit=False)
            if formsets.is_valid():
                formsets.instance = self.object
                formsets.save(commit=False)
                for element in formsets:
                    element.save(commit=False)
            self.object = form.save()
            formsets.save()
        return super(PublicationCreateView, self).form_valid(form)
     except IntegrityError:
         ...

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

Проблема возникаетесли у меня неправильное поле в моей форме.Когда первая форма сохраняется, она создает объект только с первой формой, а не со связанной формой в моем наборе форм.

Это пример:

enter image description here

Как вы можете видеть, это сохраняет мою первую форму, но я не хочу, пока все формы не будут действительными.

Мне нужно переключаться между .save(commit=False) и .save()методы.

Спасибо

1 Ответ

0 голосов
/ 27 ноября 2018

Итак, не сохраняйте основную форму первой.

if form.is_valid() and formsets.is_valid():
    self.object = form.save()
    formsets.instance = self.object
    formsets.save()

(Обратите внимание, что вам не нужно сохранять формы набора по отдельности; просто удалите commit=False оба раза.)

...