Я немного оглянулся, но не могу понять, как это сделать. У меня в основном есть форма документа и элемент inlineformset в представлении, и мне нужно выполнить некоторую проверку, зависящую от значений полей в каждой форме. Например, если поле copyright_needed Item равно YES, необходимо указать поле учетной записи документа.Django: как проверить inlineformset в отношении другой связанной формы
Как передать ссылку на форму Документа, так что в чистом методе ItemForm я могу посмотреть очищенные_данные формы документа? Я пытаюсь использовать карри, как я видел, рекомендовал в других ответах SO, но он работает не совсем правильно.
Models.py
class Document(models.Model):
account = models.CharField(max_length=22, blank=True, null=True)
class Item(models.Model):
copyright_needed = models.CharField(max_length=1)
# Document foreign key
document = models.ForeignKey(Document)
Это чистый метод ItemForm, который показывает, что я хотел бы достичь, и ошибка я получаю.
Forms.py - EDIT - добавил INIT в ItemForm
class ItemForm(forms.ModelForm):
class Meta:
model = Item
fields=[..., 'copyright_needed' ]
def __init__(self, *args, **kwargs):
self.doc_form = kwargs.pop('doc_form')
super(ItemForm, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = super(ItemForm, self).clean()
msg_required = "This field is required."
cr = cleaned_data.get("copyright_needed")
# This line generates this error: DocumentForm object has no attribute cleaned_data
acct_num = self.doc_form.cleaned_data.get("account")
if cr and cr == Item.YES:
if not acct_num:
self.doc_form.add_error("account", msg_required)
return cleaned_data
class DocumentForm(forms.ModelForm):
...
account = forms.CharField(widget=forms.TextInput(attrs={'size':'25'}), required=False)
class Meta:
model = Document
fields = [ ..., 'account' ]
views.py
def create_item(request):
# create empty forms
form=DocumentForm()
ItemFormSet = inlineformset_factory(Document, Item,
form=ItemForm,
can_delete=False,
extra=1)
# This is my attempt to pass the DocumentForm to each ItemForm, but its not working
ItemFormSet.form = staticmethod(curry(ItemForm, doc_form=form))
item_formset=ItemFormSet(instance=Document())
if request.POST:
d = Document()
form=DocumentForm(request.POST, instance=d)
if form.is_valid():
new_document=form.save(commit=False)
item_formset=ItemFormSet(request.POST, instance=new_document)
if item_formset.is_valid():
new_document.save()
new_item=item_formset.save()
return HttpResponseRedirect(...)
item_formset=ItemFormSet(request.POST)
return render(request,...)
Я добавил инициализации для ItemForm, который я случайно оставил вне. Я использую inlineformset для отображения DocumentForm и ItemForm в одном представлении (create_item), где пользователь создает новый Item и новый Document, так что новый документ является внешним ключом для нового элемента. Я всегда просто создаю/редактирую один элемент за раз. Может быть, канавка inlineformset и просто показать DocumentForm и ItemForm и явно добавить отношение FK при сохранении? Кажется, я не получаю много от inlineformset. Только быстрый способ сделать это отношение при delcaring ItemFormSet – Carrie
Мой вопрос по-прежнему остается: когда я нахожусь в чистом методе ItemForm, как я могу получить ссылку на DocumentForm? Я вижу, что вы говорите о создании customformset с помощью чистого метода, но я не вижу, как этот formet (который будет представлять мой ItemFormset) может сравнивать поля формы с полями в DocumentForm, которые были отправлены одновременно ? Неужели все еще неясно, что мне нужно? – Carrie
В моем чистом методе MyCustomFormset есть ли self.instance, доступ к которому я могу получить, чтобы получить экземпляр (Document), объявленный при создании item_formset при обработке POST? – Carrie