2017-02-16 2 views
0

私はユーザーがパスワードを変更できるフォームとメソッドを作ろうとしています。ユーザーがフォームより2つの入力にパスワードを入力すると、それらが同じであるかどうかを確認してdbを更新します。しかし、私はこのエラーが発生し、私はそれを解決することができませんでした。Django:フォームを使ってパスワードを変更するときのNoReverseMatch

エラーメッセージ

NoReverseMatch at /blog/password_change/blue/ 
Reverse for 'profile' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'blog/profile/(?P<username>[-\\w.]+)/$'] 

urls.py

url(r'^password_change/(?P<username>[-\w.]+)/$', views.password_change, name='password_change'), 
url(r'^profile/(?P<username>[-\w.]+)/$', views.profile, name='profile'), 

views.py

def password_change(request, username): 
if request.method == 'POST': 
    form = PasswordChangeForm(data=request.POST, user=request.user) 

    if form.is_valid(): 
     form.save() 
     update_session_auth_hash(request, form.user) 
     return redirect(reverse('blog:profile')) 
    else: 
     return redirect(reverse('blog:profile')) 
else: 
    form = PasswordChangeForm(user=request.user) 

    return HttpResponseRedirect('/blog/') 

profile.html。これがテンプレートです。

<form class="form-horizontal" role="form" action="{% url'blog:password_change' user.username %}" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
<label for="password1">new password</label> 
<div class="row"> 
    <input type="password" name="password1" id="password1"/></div> 
<div class="row"> 
<label for="password2">password check</label></div> 
<div class="row"> 
    <input type="password" name="password2" id="password2"/></div> 
<div class="row"> 
     <button type="submit" class="button-primary">change password</button></div> 

views.py

def password_change(request, username): 
if request.method == 'POST': 
    form = PasswordChangeForm(data=request.POST, user=request.user) 

    if form.is_valid(): 
     form.save() 
     update_session_auth_hash(request, form.user) 
     return redirect(reverse('blog:profile')) 
    else: 
     return redirect(reverse('blog:profile')) 
else: 
    form = PasswordChangeForm(user=request.user) 

    return HttpResponseRedirect('/blog/') 

これはあなたのエラー状態としてforms.py

class PasswordChangeForm(forms.ModelForm): 
    error_messages = { 
    'password_mismatch': ("The two password fields didn't match."), 
} 
password1 = forms.CharField(
    label=("Password"), 
    strip=False, 
    widget=forms.PasswordInput, 
    help_text=password_validation.password_validators_help_text_html(), 
) 
password2 = forms.CharField(
    label=("Password confirmation"), 
    widget=forms.PasswordInput, 
    strip=False, 
    help_text=("Enter the same password as before, for verification."), 
) 

class Meta: 
    model = User 
    fields = ("username",) 
    field_classes = {'username': UsernameField} 

def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs) 
    if self._meta.model.USERNAME_FIELD in self.fields: 
     self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': True}) 

def clean_password2(self): 
    password1 = self.cleaned_data.get("password1") 
    password2 = self.cleaned_data.get("password2") 
    if password1 and password2 and password1 != password2: 
     raise forms.ValidationError(
      self.error_messages['password_mismatch'], 
      code='password_mismatch', 
     ) 
    self.instance.username = self.cleaned_data.get('username') 
    password_validation.validate_password(self.cleaned_data.get('password2'), self.instance) 
    return password2 

def save(self, commit=True): 
    user = super().save(commit=False) 
    user.set_password(self.cleaned_data["password1"]) 
    if commit: 
     user.save() 
    return user  
+0

のプロフィール – Sayse

+1

が重複する可能性のためのURLを記載してください[何NoReverseMatchエラーです、どうすれば修正できますか?](http://stackoverflow.com/questions/38390177/what-is-a-noreversematch-error-and-how-do-i-fix-it) – Sayse

答えて

2

で、プロファイルのURLでユーザー名の引数を必要とし、そのあなたはまったく提供しません。例えば

return redirect(reverse('blog:profile')) 

あなたは()を逆転するためのユーザー名を渡す必要があり

return redirect(reverse('blog:profile', args=[form.user.get_username()])) 
+1

注'redirect'を使うときに' reverse'は必要ありません。最後の行は 'return redirect(blog:profile '、form.user.get_username())' – Alasdair

+1

@ Alasdairに簡略化することができます。 – Sayse

0

でなければなりません。

ユーザ名= form.user.get_username()

リバース( 'ブログ:プロフィール'、kwargsからは= { 'ユーザ名':ユーザー名})

関連する問題