Подтвердить что ты не робот

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, хотя, очевидно, я что-то пропустил, Я был бы очень признателен за свежие глаза, чтобы рассказать мне, в чем я ошибаюсь.

Спасибо

4b9b3361

Ответ 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, и ваша форма будет недействительной без ошибок, поскольку она не связана.