2016-05-07 8 views
0

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

У пользователя есть имя пользователя, адрес электронной почты и фотография.

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

Похоже, что

enter image description here

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

forms.py

class UpdateProfile(forms.ModelForm): 
    username = forms.RegexField(regex=r'^\w+$', widget=forms.TextInput(attrs=dict(required=True, max_length=30)), 
           label=_("Username"), error_messages={ 
      'invalid': _("This value must contain only letters, numbers and underscores.")}) 
    email = forms.EmailField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Email address")) 
    password = forms.CharField(
     widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)), label=_("Password")) 
    picture = forms.ImageField(required=False) 

    class Meta: 
     model = Person 
     fields = ('username', 'email', 'password', 'picture') 

    def clean_username(self): 
     if self.initial['username'] == self.cleaned_data['username']: 
      return self.cleaned_data['username'] 
     try: 
      user = Person.objects.get(username__iexact=self.cleaned_data['username']) 
     except Person.DoesNotExist: 
      return self.cleaned_data['username'] 
     raise forms.ValidationError(_("The username already exists. Please try another one.")) 

    def clean_email(self): 
     email = self.cleaned_data["email"] 
     if self.initial['email'] == email: 
      return email 
     try: 
      gg = Person.objects.get(email=email) 
     except Person.DoesNotExist: 
      return email 
     print("DUPLICATE") 
     raise forms.ValidationError('duplicate email') 

    def clean(self): 
     if 'password' in self.cleaned_data : 
      p =Person.objects.get(username__iexact=self.initial['username']) 
      if not p.check_password(self.cleaned_data['password']): 
       raise forms.ValidationError(_("Password is wrong.")) 
     return self.cleaned_data 

views.py

def edit(request): 
    args = {} 
    args.update(csrf(request)) 
    if request.method == 'POST': 
     user_form = UpdateProfile(request.POST, request.FILES, instance=Person.objects.get_by_natural_key(request.user.get_username())) 
     args['user_form'] = user_form 
     if user_form.is_valid(): 
      user_form.save() 
      return HttpResponseRedirect('/profile/') 
    args['user_form'] = UpdateProfile(request.POST or None) 
    args['user2'] = Person.objects.get_by_natural_key(request.user.get_username()) 
    return render_to_response('edit.html', args, context_instance=RequestContext(request)) 

В HTML у меня есть по умолчанию форму.

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

ответ

0
class Meta: 
     model = Person 
     fields = ('username', 'email', 'picture') 

Я удалил пароль с полей и теперь он работает. Я не знаю, является ли это правильным решением моей проблемы, но это работает.

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