Django ModelForm не выполняет проверку без ошибок
Хорошо, я часами смотрел на это, пытаясь понять, что происходит, но безрезультатно.
Я пытаюсь создать ModelForm, используя ключевое слово 'instance', чтобы передать ему существующий экземпляр модели, а затем сохранить его.
Вот ModelForm (значительно удалился от оригинала в моих попытках определить причину этой проблемы):
class TempRuleFieldForm(ModelForm):
class Meta:
model = RuleField
и вот код, который я запускаю:
>>> m = RuleField.objects.get(pk=1)
>>> f = TempRuleFieldForm(instance=m)
>>> f.is_valid()
False
Объект модели (m
выше) действителен, и он сохраняет только штраф, но форма не будет проверяться. Теперь, насколько я могу судить, этот код идентичен примеру Django docs, найденному здесь: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method, хотя, очевидно, я что-то пропустил, Я был бы очень признателен за свежие глаза, чтобы рассказать мне, в чем я ошибаюсь.
Спасибо
Ответы
Ответ 1
Обратите внимание, что ваша ссылка не вызывает f.is_valid()
, она просто сохраняет файл. Это потенциально немного вводит в заблуждение.
Дело в том, что создание экземпляра с помощью только параметра instance
, но не data
не связывает его с данными, поэтому форма недействительна. Вы увидите, что f.is_bound
- False.
За кулисами instance
действительно то же самое, что и передача данных initial
, которые, поскольку примечание к документам используется только для первоначального отображения данных и не используется для сохранения. Вероятно, вам будет полезно читать примечания на связанных и несвязанных формах.
Ответ 2
Если вы все еще хотите проверить объект, который был в базе данных, вы можете сначала его сериализовать, а затем создать с ним форму.
from django.utils import simplejson
from django.core.serializers import serialize
(...)
fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields']
form = forms.MyForm(fields_dict)
if form.is_valid
Это, вероятно, не лучший способ сделать это, но единственное, что я нашел, чтобы получить связанную форму от модели. Мне нужно это, потому что я хочу проверить текущие данные в базе данных. Я создаю вопрос, так как не думаю, что это лучший способ сделать это:
Преобразование несвязанной формы в связанную?
Ответ 3
Это не решение для OP, но оно относится к заголовку сообщения, который довольно высок в Google. Поэтому я отправлю его в любом случае, здесь:
Если вы уже передаете request.POST своей форме с помощью request.POST or None
, но она по-прежнему недействительна без ошибок, проверьте, нет ли перенаправления. Переадресация теряет данные POST, и ваша форма будет недействительной без ошибок, поскольку она не связана.