-
Доброго всем дня!
Встала передо мной следующая задачка: у пользователя есть возможность изменить некоторые данные, которые он вводил при регистрации. Но измененные данные не сохраняются непосредственно в БД, а отправляются по e-mail в оффис для проверки и лишь после ручной проверки меняются. Теперь, собственно, вопрос: каким образом проверить что посланные данные отличаются от текущих? Форма построена по модели расширенного User-a. Соответственно получить измененную инстанцию юзера можно так:
однако следующее сравнениеchanged_user = form.save(commit=False)
всегда возвращает False (что в общем-то верно). Сравнивать поочередно каждое поле не кажется мне правильным способом (полей много).changed_user == request.user
Есть ли какой-нибудь более адекватный способ проверить изменились ли какие-либо поля? -
В таком случае, попробуйте сравнить две формы. Ту что пришла от пользователя с такой же, но перед отправкой пользователю.
-
Посмотрите в сторону show_hidden_initial - мне кажется, их будет сравнивать с актуальными полями проще и нагляднее, чем поля несохраненного объекта.
-
Но надо учесть, что show_hidden_initial могут быть устаревшими. Например, если пользователь зачем-то откроет форму редактирования в двух экземплярах, одинаково заполнит и отправит (мало ли, склероз).
-
Fulcrum, а в данном случае по-любому будет сравнение с "устаревшими" данными, пока модератор их вручную не обновит.
-
спасибо за наводку. Прочитал пост Ивана Сагалаева про show_hidden_initial http://softwaremaniacs.org/blog/2009/01/14/changed-data-in-forms/
после чего добавил всем полям формы show_hidden_initial=True, но после валидации формы список form.changed_data хранит названия всех полей формы, а не только измененных. (кстати если не добавлять свойство show_hidden_initial=True, то происходит то же самое) -
Arcady Chumachenko: если это удоволетворяет условию задачи, то отлично. Надо лишь учитывать, что hidden initials не обязательно равны тому, что сейчас записано в базе. Кроме того, они могут быть подменены при запросе.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.


