1. andrexus

    20.07.2010

    0 ↑
    0 ↓
    Доброго всем дня!
    Встала передо мной следующая задачка: у пользователя есть возможность изменить некоторые данные, которые он вводил при регистрации. Но измененные данные не сохраняются непосредственно в БД, а отправляются по e-mail в оффис для проверки и лишь после ручной проверки меняются. Теперь, собственно, вопрос: каким образом проверить что посланные данные отличаются от текущих? Форма построена по модели расширенного User-a. Соответственно получить измененную инстанцию юзера можно так:
    changed_user = form.save(commit=False)
    однако следующее сравнение
    changed_user == request.user
    всегда возвращает False (что в общем-то верно). Сравнивать поочередно каждое поле не кажется мне правильным способом (полей много).
    Есть ли какой-нибудь более адекватный способ проверить изменились ли какие-либо поля?
  2. Lee Chang

    20.07.2010

    0 ↑
    0 ↓

    В таком случае, попробуйте сравнить две формы. Ту что пришла от пользователя с такой же, но перед отправкой пользователю.

  3. Посмотрите в сторону show_hidden_initial - мне кажется, их будет сравнивать с актуальными полями проще и нагляднее, чем поля несохраненного объекта.

  4. Fulcrum

    20.07.2010

    0 ↑
    0 ↓
    Но надо учесть, что show_hidden_initial могут быть устаревшими. Например, если пользователь зачем-то откроет форму редактирования в двух экземплярах, одинаково заполнит и отправит (мало ли, склероз).
  5. Fulcrum, а в данном случае по-любому будет сравнение с "устаревшими" данными, пока модератор их вручную не обновит.

  6. andrexus

    21.07.2010

    0 ↑
    0 ↓
    спасибо за наводку. Прочитал пост Ивана Сагалаева про 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, то происходит то же самое)
  7. Fulcrum

    21.07.2010

    0 ↑
    0 ↓
    Arcady Chumachenko: если это удоволетворяет условию задачи, то отлично. Надо лишь учитывать, что hidden initials не обязательно равны тому, что сейчас записано в базе. Кроме того, они могут быть подменены при запросе.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.