簡體   English   中英

Django:使用表單更改密碼時,NoReverseMatch位於

[英]Django : NoReverseMatch at when changing password using form

我正在嘗試制作允許用戶更改密碼的表格和方法。 當用戶在兩個輸入中輸入密碼時,表單將檢查它們是否相同並更新db。 但是我遇到了這個錯誤,但無法解決。

錯誤信息

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     

如錯誤狀態所示,您需要在配置文件url中為用戶名提供一個參數,而根本不提供該參數。

例如:

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

應該

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

您必須將用戶名傳遞給reverse()。

用戶名= form.user.get_username()

reverse('blog:profile',kwargs = {'username':username})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM