class JobForm(forms.ModelForm):
class Meta:
model = models.Job
Это было моей формой, теперь пытаться сохранить ее повысит исключение, и пытающийся проверить это просто перестал работать без ошибок....
job = get_object_or_404(models.Job, pk=1)
form = forms.JobForm(instance = job)
try:
form.save()
except:
print sys.exc_info()
#=>(<type 'exceptions.AttributeError'>, AttributeError("'JobForm' object has no attribute 'cleaned_data'",), <traceback object at 0x1029dbb48>)
Попробованный для проверки его:
if form.is_valid():
form.save()
else:
print 'error'
print form.errors, len(form.errors)
#=> 'error'
#=> 0
Таким образом, форма не допустима, но нет никаких ошибок! Какая-либо идея?
Ваша форма определенно не связана. Прочитайте о Связанные и несвязанный формы.
Из этой документации:
Чтобы привязать данные к форме, передать данные в виде словаря в качестве первого параметра в конструктор класса Form.
Это означает, что изменение поля в модели не делает форму связанной. Эти значения необходимо передать явно через конструктор. Но:
Обратите внимание, что при передаче пустого словаря создается связанная с форма с пустыми данными
, и учитывайте это
Если у вас есть связанный экземпляр Form и вы хотите каким-то образом изменить данные или если вы хотите привязать несвязанный экземпляр Form к некоторым данным, создайте другой экземпляр Form. Изменить данные в экземпляре Form невозможно. После создания экземпляра Form следует считать его данные неизменяемыми, независимо от того, есть ли у него данные или нет.
Если вы проверяете форму unbound
Бессмысленно проверять форму без данных, но для записи вот что происходит с несвязанными формами:
>>> f = ContactForm()
>>> f.is_valid()
Ложь
>>> f.ошибки
{}
Я предполагаю, что вы не можете сохранить форму модели, которая была создана только с данными экземпляра (я просто пытался сделать это с одной из моих форм и получил ту же ошибку), потому что форма не становится связанная форма, пока вы не передадите дополнительную информацию. На самом деле не имеет смысла предоставлять в форму только те данные, которые уже существуют в модели (а затем сохранять их снова), поскольку никаких изменений не будет. Если это происходит из html-формы, вы также должны передать request.POST (или request.GET) в форму.