Вау!Это удивительно сложная проблема.Я, должно быть, ударил 10 дорожных блоков.
если вам не нужна уникальная совместная проверка (чего вы в любом случае не делаете в форме модели): я думаю, что самое простое решение - исключить поля модели, переопределить save
и вручную применить очищенные данные к self.instance
.Позвольте регулярной проверке формы сделать уборку.
skip_model_validation_fields = \
('country','province','city','postal_code')
def save(self, *args, **kwargs):
for field in self.skip_model_validation_fields:
setattr(self.instance, field, self.cleaned_data.get(field))
return super(MyForm, self).save(*args, **kwargs)
class Meta:
model = Address
exclude = self.skip_model_validation_fields
Если вам нужен unique_together, вы можете вручную запустить self.unique_together()
, но в этот момент вам также потребуется зафиксировать ошибку, повторно отобразить форму и т. Д. *
Так что, возможно,новое предложение состоит в том, чтобы использовать формы вместо хакерского обращения с ModelForm
.Похоже, помощь больше не является помощью!
Проблема в том, что даже если вы поднимаете forms.ValidationError
внутри clean()
, создается экземпляр, и поля из cleaned_data
устанавливаются на этот экземпляр независимо от того,,
Перемещение валидации в поле будет работать, но будет проблемой, потому что ваша валидация имеет иерархию, и вам нужно будет определить иерархию в каждом чистом методе полей.
Индекс почты зависит от города, город зависит от провинции ... и т. Д., Иначе вы рискуете столкнуться с той же ошибкой
Вы можете удалить элементы непосредственно из cleaned_data в вашей функции clean()
, но это тожебыть королевской болью по той же причине, что и выше.
Сегодня я узнал тонну о ModelForms ...