Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django管理界面中验证新用户密码_Python_Django_Django Admin_Django Validation - Fatal编程技术网

Python 在Django管理界面中验证新用户密码

Python 在Django管理界面中验证新用户密码,python,django,django-admin,django-validation,Python,Django,Django Admin,Django Validation,这里有一个有趣的时刻: 默认情况下,验证程序在表单中用于重置或更改密码,并在createsuperuser和changepassword管理命令中使用。验证器不应用于模型级别,例如在User.objects.create_User()和create_superuser()中,因为我们假设开发人员而不是用户在该级别与Django交互,而且模型验证不会作为创建模型的一部分自动运行 但在我的Django应用程序中,我只使用带有Admin.ModelAdmin的Django管理界面 当我试图创建新用户时

这里有一个有趣的时刻:

默认情况下,验证程序在表单中用于重置或更改密码,并在createsuperuser和changepassword管理命令中使用。验证器不应用于模型级别,例如在User.objects.create_User()和create_superuser()中,因为我们假设开发人员而不是用户在该级别与Django交互,而且模型验证不会作为创建模型的一部分自动运行

但在我的Django应用程序中,我只使用带有
Admin.ModelAdmin
的Django管理界面
当我试图创建新用户时,我可以从
AUTH\u PASSWORD\u validators

在Django管理界面中使用验证器
AUTH\u PASSWORD\u验证器创建新用户时,如何验证密码

admin.py:

class UserCreateForm(ModelForm):
class Meta:
    model = User
    fields = ['username', 'password']


class UserAdmin(admin.ModelAdmin):
    form = UserCreateForm
    list_display = ('username')

    def get_form(self, request, obj=None, change=False, **kwargs):
        if change:
            return self.change_form
        return super(UserAdmin, self).get_form(request, obj, **kwargs)

    def has_add_permission(self, request):
        return True

    def has_delete_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None):
        return True

    def save_model(self, request, obj, form, change):
        if obj.pk:
            orig_obj = User.objects.get(pk=obj.pk)
            if obj.password != orig_obj.password:
                obj.set_password(obj.password)
        else:
            obj.is_superuser = True
            obj.set_password(obj.password)
        obj.save()
models.py:

class User(AbstractBaseUser, PermissionsMixin):
    USERNAME_FIELD = 'username'
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        max_length=150,
        unique=True,
        validators=[username_validator]
        )

    objects = UserManager()
managers.py:

class UserManager(BaseUserManager):
    def create_user(self, username, password=None):
        if not username:
            raise ValueError('Users must have username assigned')
        user = self.model(username=username)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None):
        user = self.create_user(username, password=password)
        user.is_superuser = True
        user.save(using=self._db)
        return user
settings.py:

AUTH_USER_MODEL = 'users.User'
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    }

您链接到的文档说明:

默认情况下,表单中使用验证器重置或更改密码

例如,
UserAdmin
使用验证密码的

您有自己的
UserAdmin
UserCreateForm
,因此除非您添加此功能,否则密码不会被验证


仔细考虑是否确实需要重写
AbstractBaseUser
。如果您替代AbstractUser
,那么使用/扩展内置表单/模型管理员将更容易,并且您不必自己实施密码验证。

您链接到的文档会说:

默认情况下,表单中使用验证器重置或更改密码

例如,
UserAdmin
使用验证密码的

您有自己的
UserAdmin
UserCreateForm
,因此除非您添加此功能,否则密码不会被验证


仔细考虑是否确实需要重写
AbstractBaseUser
。如果改为覆盖AbstractUser,那么使用/扩展内置表单/模型管理员将更容易,而且您不必自己实现密码验证。

问题作者的UPD:
对于每个有相同问题的人:您需要将该函数添加到
UserCreateForm

def clean(self):
    password = self.cleaned_data.get('password')
    if password:
        try:
            password_validation.validate_password(password, self.instance)
        except forms.ValidationError as error:
            self.add_error('password', error)

问题作者的UPD:
对于每个有相同问题的人:您需要将该函数添加到
UserCreateForm

def clean(self):
    password = self.cleaned_data.get('password')
    if password:
        try:
            password_validation.validate_password(password, self.instance)
        except forms.ValidationError as error:
            self.add_error('password', error)

您使用的是哪个版本的Django?Django 1.9.Alasdair、Django 2.0.6Alasdair中添加了密码验证,为了重现我的问题,我执行了相同的步骤。Alasdair,我添加了所有影响该问题的代码。您使用的是哪个版本的Django?Django 1.9.Alasdair、Django 2.0.6Alasdair中添加了密码验证,为了重现我的问题,我做了相同的步骤。Alasdair,我添加了所有影响该问题的代码