Django - ModelForm сохраняет данные, даже если данные неверны - PullRequest
0 голосов
/ 25 января 2011

Сортировка.

У меня форма модели определена так:

class EditUserForm(UserForm):
    def __init__(self,data=None,instance=None):
        UserForm.__init__(self,data=data,instance=instance)
        del self.fields['username']

Я сделал это, потому что хотел исключить отображение поля имени пользователя в моей EditUserForm, но из-за того, что я переписал поле имени пользователя в UserForm, ошибка в django мешает этому работать, поэтому я написал форму таким образом.

Код моего вида выглядит следующим образом:

if request.method == 'POST':
        uf = EditUserForm(request.POST,instance=user)
        upf = StudentProfileForm(request.POST,instance=profile)
        if uf.is_valid() and upf.is_valid(): 
            print 'VALID'
            uf.save()
            upf.save()
            messages.success(request, 'You have successfully updated your profile.')
            return HttpResponseRedirect('/student/editprofile')
        else:
            print 'INVALID'

Чтобы проверить это, я попытался изменить имя и сделать пароли не совпадающими, и при отправке я заметил, что был напечатан INVALID (правильно появилась ошибка проверки паролей), НО в верхней части страницы, где у меня есть «Добро пожаловать ( имя пользователя) (фамилия пользователя) "Я заметил, что имя изменилось. Когда я перехожу на другую страницу, она возвращается к правильному значению. Как сделать так, чтобы этого не произошло?

Это мой HTML-код:

{% if user.is_authenticated %}
    Welcome, <a href = "/{{user.get_profile.getType}}/profile">{{user.first_name}} {{user.last_name}}</a> | 
    <a href = "/auth/logout">Logout</a>
{% else %}
{% endif %}

Мое предположение относительно того, что происходит, когда я публикую данные, это помещает user.first_name в контекст, перезаписывая фактическое user.first_name. Но это недействительно, потому что данные еще не сохранены ...

Итак, , как я могу использовать user.first_name в шаблоне, который публикуется без изменения его значения до тех пор, пока он действительно не будет действительным ??

1 Ответ

0 голосов
/ 25 января 2011

Ваше предположение верно.После проверки ModelForm обновляет данный экземпляр (user) с указанным data, оставляя его в недопустимом состоянии.

Вы можете:

  • попытатьсясоздайте копию user,
  • , перезагрузите user из базы данных,
  • или сохраните user.first_name во временной переменной и установите ее обратно при ошибке проверки

Редактировать: обратите внимание, что хотя ModelForm изменяет экземпляр, он не сохраняет его.

...