Django модель формы - несколько моделей - PullRequest
1 голос
/ 16 марта 2012

У меня есть пара моделей, таких как Listing, Image (один ко многим в список), Category (один ко многим в список) и т. Д.

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

Ответы [ 2 ]

1 голос
/ 16 марта 2012

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

Для вашего второго вопроса вам нужно переопределить чистоту() метод модели, о которой вы заботитесь.Вот пример того, что я написал недавно:

def clean(self):
    cleaned_data = self.cleaned_data
    npv = cleaned_data.get("npv")
    irr = cleaned_data.get("irr")
    if npv == irr:
        raise forms.ValidationError('Must have either an NPV or IRR entry.')
    if (npv != None) and (irr != None):
        raise forms.ValidationError('Must have only one entry, either NPV or IRR.')
    return cleaned_data

Есть также документы по переопределению clean:

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overiding-clean-on-a-model-formset

Редактировать:

Под этим «я обычно использую две / три / четыре формы модели» я подразумеваю, что я создаю модели формы для каждой модели.Я создаю их экземпляр на уровне представления и отправляю их как часть контекста в шаблон:

a = ModelFormA()
b = ModelFormB()
c = ModelFormC()

c = {'a':a,'b':b,'c':c}
return rendertoresponse('template.html',c)

, если некоторые из ваших моделей имеют одинаковые имена столбцов, просто используйте префиксный аргумент при создании экземпляра.

Документы по префиксу находятся здесь:

https://docs.djangoproject.com/en/dev/ref/forms/api/#prefixes-for-forms

, тогда вы можете просто передать request.POST в каждую форму модели, не разбирая поля по отдельности.

1 голос
/ 16 марта 2012

Вы можете использовать универсальные классы форм для предоставления вам форм, которые будут содержать раскрывающиеся списки для одного или многих полей.

Чтобы проверить уровень формы, см. Здесь: https://docs.djangoproject.com/en/dev/ref/forms/validation/#form-and-field-validation

По сути, если все ваши проверки на уровне поля пройдены, django может проверить, прошла ли вся форма, которую вы тестировали (как минимум, 3 изображения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...