编辑管理面板中的用户密码
问题描述:
我已经覆盖“save_model”方法来管理我的管理员面板应用程序中的用户密码。我要的是:编辑管理面板中的用户密码
- 创建一个新的随机密码,当我创建新用户(如果密码字段为空)
- 加密密码(如果我将它设置)
- 使用用户的密码(如果我改变用户但未设置密码)
如何定义最后的条件?
def save_model(self, request, obj, form, change):
if not change and (not form.cleaned_data['password']) :
password = User.objects.make_random_password()
obj.set_password(password)
elif form.cleaned_data['password'] :
obj.set_password(form.cleaned_data['password'])
else
?
super(UserAdmin, self).save_model(request, obj, form, change)
答
你正在做这一切有点太晚了。用户创建表单甚至不允许您发布没有填写字段password1
和password2
的表单。如果这些字段为空,您将永远不会使用UserAdmin.save_model()
方法。
但是,您可以覆盖用户创建表格的save()
方法,其中允许密码字段为空,并且如果字段为空(或使用用户密码(如果已输入)),则设置随机密码。
作为奖励,如果用户输入密码(密码不匹配)以及检查AUTH_PASSWORD_VALIDATORS
(除了'django.contrib.auth.password_validation.MinimumLengthValidator'
,因为空密码字段意味着0个字符),此代码将保持表单验证状态。
### admin.py
from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class CustomUserCreationForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['password1'].required = False
self.fields['password2'].required = False
def _clean_form(self):
super()._clean_form()
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 != password2:
self.add_error('password2', self.error_messages['password_mismatch'])
def save(self, commit=True):
user = super().save(commit=False)
user_password = self.cleaned_data["password1"]
if not user_password:
user_password = User.objects.make_random_password()
user.set_password(user_password)
if commit:
user.save()
return user
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)