Как переопределить / обновить информацию из POST при создании модели
У меня есть представление, которое обрабатывает запрос POST и пытается создать новый объект. Тем не менее, я знаю, что некоторые из данных POST недействительны... Но я хочу исправить это и продолжить создание объекта.
Единственный способ выяснить, как можно "исправить" данные в ModelForm, - это создать форму is_valid(). Для этого я могу либо создать форму с данными POST, либо создать ее с уже существующим экземпляром. К сожалению, если я использую данные POST, поскольку некоторые из них являются недействительными, форма не будет проверяться, и поэтому я не могу получить данные в форме, чтобы исправить это. Если я создаю его с уже существующим экземпляром, это работает, но когда отображается форма, все оставшиеся ошибки по какой-либо причине игнорируются (и, следовательно, не отображаются на веб-странице.) Я пробовал комбинацию создания форма Model из данных POST и предоставление ей экземпляра, но это, похоже, не помогает. Кроме того, я попытался изменить (копию) данных POST, исправить их, а затем создать ModelForm из "фиксированных" данных POST. Такого рода работы, за исключением того, что у меня есть несколько полей ImageFields в моей форме, и они, кажется, просто игнорируются.
Любая помощь будет принята с благодарностью. Я просмотрел все хорошие страницы, которые могу найти, но безрезультатно.
Возможно, есть лучший способ сделать это? Проблема, которую я пытаюсь решить, состоит в том, что я хочу иметь модель, которая содержит ImageFields. Когда я в первый раз заполняю форму, пользователю нужно "загрузить" изображения для каждого из полей. Однако, если он не обновляет изображение для одного из полей, я хочу, чтобы в новой форме появилась кнопка "Загрузить изображение" на полях, где изображения не были загружены, и просто текстовое поле с именем изображения для изображений. которые были загружены.
Изменить 15.09.2010:
Хорошо, я думаю, что могу упростить весь вышеупомянутый вопрос в это:
тестирование по умолчанию (запрос) test_form = UserProfileForm() valid = test_form.is_valid() возвратный рендер ( 'testing.tmpl', locals(), запрос)
Когда приведенный выше код отображается, "valid" отображается как False (как и следовало ожидать), но "test_form" отображается без каких-либо ошибок. Я прочитал (если, возможно, не понял?) Документацию по моделям и ModelForms, и я вижу, что большую часть времени ModelForm (в моем случае: UserProfileForm) создается с указанным "экземпляром". Тем не менее, 1) у меня еще нет экземпляра, 2) я все равно ожидал бы, что неэкземплярная форма будет отображать ошибки. Я уверен, что что-то упускаю. Пожалуйста, осветите.:)
Еще одна вещь, на которую, возможно, ответит на вышеприведенное, все равно ответит, но, насколько я могу судить, вызов is_valid() должен вызывать функцию clean(), которую я определил для UserProfileForm. Тем не менее, (не будучи гуру Python) я поместил 'Raise ValidationError()' в верхней части clean(), и когда я запускаю код, ошибка не отображается. Мысли?
Обновление: я выяснил проблему, и ответ ниже. Спасибо!
3 ответа
Вы должны взглянуть на то, как очистить поля формы в Django. Вы можете либо манипулировать данными, возвращенными из формы, либо выполнять любые проверки!
Если ваши ImageFields являются необязательными, вы все равно можете их проверить (что в противном случае они верны).
Затем нужно настроить шаблон так, чтобы он отображал либо имя загруженного файла, либо поле загрузки файла, в зависимости от того, загружен ли он уже или нет. На самом деле, было бы, вероятно, лучше дать им оба поля в первом случае. Это то, что делает автоматический администратор (поле загрузки помечено как "Изменить").
Что ж, после выяснения, как использовать отладчик python (pdb) и тот факт, что в emacs он "просто работает" (вау!?), я смог обнаружить, что моя (пустая) форма не была связана. Гугл связанные формы указали мне на эту страницу:
http://docs.djangoproject.com/en/dev/ref/forms/api/
RTFM'ing я нахожу, что я могу передать пустой словарь в мою форму, и тогда все начинает вести себя, как я ожидал. Итак, подведем итог, есть большая разница между:
test_form = UserProfileForm ()
а также
test_form = UserProfileForm( {})
Вторая версия заставляет рендеринг формы показывать все ошибки (и вызывать 'clean()').
С риском удаления этого модератором;) Спасибо всем, кто прокомментировал и за ваше терпение с новым разработчиком django.