Проверка формы в Admin с встроенным набором форм и формой модели - PullRequest
5 голосов
/ 09 июня 2009

У меня есть модель OrderedList, которая предназначена для отображения списка объектов контента, заказанных пользователем. OrderedList имеет несколько атрибутов, включая сайт, к которому он принадлежит.

Объекты содержимого присоединяются к нему через класс OrderedListRow, который передается администратору OrderedList через встроенный набор форм в администраторе.

class OrderedList(GenericList):

    objects = models.Manager()
    published = GenericListManager()

class OrderedListRow(models.Model):

    list = models.ForeignKey(OrderedList)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveSmallIntegerField()
    content_object = generic.GenericForeignKey("content_type", "object_id")
    order = models.IntegerField('order', blank = True, null = True)

(OrderedList наследует поле сайта от большего резюме GenericList).

Вот моя проблема; когда пользователь сохраняет форму администратора, я хочу убедиться, что каждый объект контента, сопоставленный каждому OrderedListRow, принадлежит тому же сайту, что и OrderedList (список может принадлежать только одному сайту; объекты контента могут принадлежать нескольким).

Я могу переопределить команду clean () формы администрирования OrderedList, но она не включает встроенный набор форм, который содержит OrderedListRows, поэтому он не может получить эти данные. Я могу переопределить очистку встроенного набора форм OrderedListRows, но он не может достичь списка. Мне нужен какой-то способ в контексте проверки формы, чтобы получить доступ как к данным формы OrderedList, так и к данным формы formset, чтобы я мог проверить все сайты объектов содержимого OrderedListRow относительно сайта OrderedList и выдать ошибку проверки, если есть проблема , До сих пор я не нашел функцию, в которой содержатся очищенные данные как для OrderedRow, так и для OrderedListRows.

Ответы [ 2 ]

5 голосов
/ 09 июня 2009

Во встроенном наборе форм, self.instance должен ссылаться на родительский объект, то есть OrderedList.

1 голос
/ 25 сентября 2009

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

Если есть изменения как во встроенном наборе форм, так и в форме администратора, доступ к self.instance не даст точных данных, поскольку вы будете основывать проверку на базе данных, а затем сохраните набор форм, который перезапишет те данные, которые вы только что использовали для проверки вещи. В основном это делает вашу проверку одним спасением позади.

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

...