Python 在Django管理界面中验证新用户密码
这里有一个有趣的时刻: 默认情况下,验证程序在表单中用于重置或更改密码,并在createsuperuser和changepassword管理命令中使用。验证器不应用于模型级别,例如在User.objects.create_User()和create_superuser()中,因为我们假设开发人员而不是用户在该级别与Django交互,而且模型验证不会作为创建模型的一部分自动运行 但在我的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管理界面 当我试图创建新用户时
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,我添加了所有影响该问题的代码