2

我正在使用 django 内置的身份验证 url 和视图

所以,在 url.py

url(r'^accounts/', include('django.contrib.auth.urls')),

在views.py中

from MyApp.forms import *
from django.contrib.auth.views import *

我想自定义 django inbuit 视图password_reset_confirm函数使用的 SetPasswordForm,因为我需要对 new_password1 进行更多检查

在我的 forms.py 中,我有如下自定义的 SetPasswordForm(使用从contrib.auth.forms already

class SetPasswordForm(SetPasswordForm):
    error_messages = {
        'invalid_password': _("Please enter a valid password as instructed"),
        'password_mismatch': _("The two password fields didn't match."),
    }
    new_password1 = forms.CharField(widget=forms.PasswordInput, min_length=6, label='New Password' )
    new_password2 = forms.CharField(widget=forms.PasswordInput, min_length=6, label='Confirm new password')

    def clean_new_password1(self):
        password1 = self.cleaned_data.get("password1")

        # password must contain both Digits and Alphabets
        # password cannot contain other symbols
        if password1.isdigit() or password1.isalpha() or not password1.isalnum():
            raise forms.ValidationError(
                self.error_messages['invalid_password'],
                code='invalid_password',
            ) 
        return password1

谁能帮助解释为什么 django 内置视图无法识别我自定义的 SetPasswordForm 以及是否可以这样做?

如果不是要识别自定义的 SetPasswordForm,那意味着我必须重新定义 url 和 views 参数(以指定要使用的表单)对吗?如果有任何错误,请纠正我

非常感谢。

4

2 回答 2

1

您应该覆盖 URL 以将您的自定义表单类作为视图关键字参数传递。如何覆盖来自外部 Django 应用程序的视图中的详细信息。

于 2013-07-02T11:38:22.520 回答
1

您需要稍微修正一下您的网址。

在你的urls.py,这...

urlpatterns = [
    ...
    url(r'^accounts/', include('django.contrib.auth.urls')),
    ...
]

需要是...

import django.contrib.auth.views as auth_views
from myapp.forms import SetPasswordForm

urlpatterns = [
    ...

    url(r'^accounts/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
    auth_views.password_reset_confirm, {'set_password_form': SetPasswordForm}, name='password_reset_confirm'),
    url(r'^accounts/', include('django.contrib.auth.urls')),
    ...
]

password_reset_confirmurl 位于另一个 url 之上是至关重要的。

于 2017-04-06T19:29:15.143 回答