2014-11-24 2 views
1

Я создал страницу, которая позволяет пользователю редактировать свою информацию о профиле.Обновление пароля Django не работает

Каждый раз, когда пользователь менял пароль, он не обновлял базу данных и несколько искажал пароль.

edit_user.html

<form style="display:inline"class="form-signin" action="/edit_user/" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit" class="btn btn-info"> Save Changes</button> 
</form> 

forms.py

class UserProfileForm(forms.Form): 
    email = forms.EmailField(label='Email', widget=forms.TextInput(attrs={'class' : 'form-control'})) 
    firstname = forms.CharField(label='First Name', max_length=15, widget=forms.TextInput(attrs={'class' : 'form-control'})) 
    lastname = forms.CharField(label='Last Name', max_length=15, widget=forms.TextInput(attrs={'class' : 'form-control'})) 
    #zip = forms.IntegerField(validators=[MinValueValidator(0),MaxValueValidator(99999)], label="Zipcode", widget=forms.TextInput(attrs={'class' : 'form-control'})) 
    oldPassword = forms.CharField(required=False, label='Current Password', widget=forms.PasswordInput(attrs={'class' : 'form-control'})) 
    password1 = forms.CharField(required=False, label="New Password", widget=forms.PasswordInput(attrs={'class' : 'form-control'})) 
    password2 = forms.CharField(required=False, label="Confirm New Password", widget=forms.PasswordInput(attrs={'class' : 'form-control'})) 

    def clean_password(self): 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise forms.ValidationError(_("The two password fields did not match.")) 
     return self.cleaned_data 

views.py

@login_required 
def edit_user(request): 
    if '_auth_user_id' in request.session: 
     u = User.objects.get(id=request.session['_auth_user_id']) 

     if request.method == 'POST': 
      form = UserProfileForm(request.POST) 
      form.fields["email"].initial = u.email 
      form.fields["firstname"].initial = u.first_name 
      form.fields["lastname"].initial = u.last_name 

      if form.is_valid(): 
       fname = form.cleaned_data['firstname'] 
       lname = form.cleaned_data['lastname'] 
       email = form.cleaned_data['email'] 
       oldPassword = form.cleaned_data['oldPassword'] 
       pword = form.cleaned_data['password1'] 

       # if oldPassword != u.password: 
       #  #"The current password does not match with your old password!" 
       #  return render(request, 'edit_user.html', { 'form': form}) 

       User.objects.filter(id=u.id).update(first_name = fname, last_name = lname, email = email, password = pword) 
       return HttpResponseRedirect('/edit_user/') 

     else: 
      form = UserProfileForm() 
      form.fields["email"].initial = u.email 
      form.fields["firstname"].initial = u.first_name 
      form.fields["lastname"].initial = u.last_name 

     variables = RequestContext(request, {'form': form}) 
     return render(request, 'edit_user.html', variables,) 

Когда я иду в настройках администратора, и проверьте пароль пользователя, он отображает это :

Password: 
Invalid password format or unknown hashing algorithm. 

Raw passwords are not stored, so there is no way to see this user's password, but you can change the password using this form. 

Любая помощь будет замечательной!

Спасибо.

ответ

1

Это django, защищающий вас от случайного хранения пароля в виде обычного текста.

Чтобы установить пароль для пользователя, звоните:

user.set_password(new_password) 

Это будет хранить пароль в correct (hashed) format.

Стоит отметить, что в django уже есть a pre-built view for changing passwords.


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

if '_auth_user_id' in request.session: 
    u = User.objects.get(id=request.session['_auth_user_id']) 

... потому что вы можете получить пользователь непосредственно от запроса:

u = request.user 
if u.is_authenticated(): 
    ... 
+0

Он по-прежнему дает тот же «Недопустимый формат пароля или неизвестное хеширование ...» после добавления 'u.set_password (pword)' – user4234041

+0

Вы удалили 'password = pword' из вызова' update'? – meshy

+0

Вам также нужно будет вызвать 'u.save()' впоследствии. Я бы не рекомендовал использовать метод «update» вообще в этом представлении. – meshy

Смежные вопросы