Как переопределить / обновить информацию из POST при создании модели - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть представление, которое обрабатывает запрос POST и пытается создать новый объект. Тем не менее, я знаю, что некоторые данные POST'а недействительны ... Но я хочу исправить это и продолжить создание объекта.

Единственный способ выяснить, как я могу исправить данные в ModelForm, - это создать форму is_valid (). Для этого я могу либо создать форму с данными POST, либо создать ее с уже существующим экземпляром. К сожалению, если я использую данные POST, потому что некоторые из них являются недействительными, форма не будет проверена, и поэтому я не могу получить данные в форме, чтобы исправить это. Если я создаю его с уже существующим экземпляром, это работает, но когда отображается форма, все оставшиеся ошибки по какой-либо причине игнорируются (и, следовательно, не отображаются на веб-странице.) Я пробовал комбинацию создания форма Model из данных POST и предоставление ей экземпляра, но это, похоже, не помогает. Кроме того, я попытался изменить (копию) данных POST, исправить их, а затем создать ModelForm из «фиксированных» данных POST. Такого рода работы, за исключением того, что в моей форме есть несколько полей ImageFields, и они, похоже, просто игнорируются.

Любая помощь будет принята с благодарностью. Я просмотрел все хорошие страницы, которые могу найти, но безрезультатно.

Возможно, есть лучший способ сделать это? Проблема, которую я пытаюсь решить, состоит в том, что я хочу иметь модель, которая содержит ImageFields. Когда я в первый раз заполняю форму, пользователю нужно «загрузить» изображения для каждого из полей. Однако, если он не обновляет изображение для одного из полей, я хочу, чтобы в новой форме появилась кнопка «Загрузить изображение» в полях, где изображения не были загружены, и просто текстовое поле с именем изображения для изображений. которые были загружены.


Изменить 15.09.2010:

Хорошо, я думаю, что могу упростить весь вышеупомянутый вопрос в следующем:

def testing( request ) :
    test_form = UserProfileForm()
    valid = test_form.is_valid()

    return render( 'testing.tmpl', locals(), request )

Когда приведенный выше код отображается, «valid» отображается как False (как и следовало ожидать), но «test_form» отображается без каких-либо ошибок. Я прочитал (если, возможно, не понял?) Документацию по моделям и ModelForms, и я вижу, что большую часть времени ModelForm (в моем случае: UserProfileForm) создается с указанным «экземпляром». Тем не менее, 1) у меня еще нет экземпляра, 2) я все равно ожидал бы, что неэкземплярная форма будет отображать ошибки. Я уверен, что что-то мне не хватает. Пожалуйста, осветите. :)

Еще одна вещь, на которую, возможно, в любом случае ответит ответ на вышеприведенный вопрос, но, насколько я могу судить, вызов is_valid () должен вызывать функцию clean (), которую я определил для UserProfileForm. Тем не менее, (не будучи гуру Python) я поместил 'Raise ValidationError ()' в верхней части clean (), и когда я запускаю код, ошибка не отображается. Мысли?

Обновление: я разобрался с проблемой и ответ ниже. Спасибо!

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Вы должны взглянуть на как очистить поля формы в django .Вы можете либо манипулировать данными, возвращенными из формы, либо выполнить любую проверку!

0 голосов
/ 16 ноября 2010

Что ж, после выяснения, как использовать отладчик python (pdb) и тот факт, что в emacs он «просто работает» (вау !?), я смог обнаружить, что моя (пустая) форма не была связана. Гугл связанные формы указали мне на эту страницу:

http://docs.djangoproject.com/en/dev/ref/forms/api/

RTFM'ing Я обнаружил, что могу передать пустой словарь в мою форму, и тогда все начнет работать так, как я и ожидал. Итак, подведем итог, есть большая разница между:

test_form = UserProfileForm() 

и

test_form = UserProfileForm( {} ) 

Вторая версия заставляет рендеринг формы показывать все ошибки (и вызывать 'clean ()').

С риском быть удаленным модератором;) Спасибо всем, кто прокомментировал, и за ваше терпение с новым разработчиком django.

0 голосов
/ 12 ноября 2010

Если ваши ImageFields являются необязательными, вы все равно можете проверить их (что они в противном случае верны).

Затем необходимо настроить шаблон так, чтобы он отображал либо имя загруженного файла, либо поле загрузки файла в зависимости отзагрузили ли они уже один или нет.На самом деле, было бы лучше дать им оба поля в первом случае.Это то, что делает автоматический администратор (поле загрузки помечено как «Изменить»).

...