如果该字段可以为空,则上述解决方案有效。使用 render_value 会将密码呈现到输入字段中,并将值显示为 asterix 占位符。
注意:如果您只是想对用户隐藏密码,这很好,但是使用 javascript 可以读取密码。
class UserForm(forms.ModelForm):
class Meta:
model = Org
fields = '__all__'
widgets = {
'password': forms.PasswordInput(render_value=True),
}
编辑:
在不暴露当前密码的情况下找到了更好的解决方案。
PASSWORD_ASTERIX_PLACEHOLDER 将在加载输入时设置为值。在保存模型之前,如果用户没有设置明确的新密码,它会将值恢复为旧值。
表单输入:
class PrefilledPasswordInput(PasswordInput):
PASSWORD_ASTERIX_PLACEHOLDER: str = 'hidden-password'
def __init__(self, attrs: dict = None, *args, **kwargs):
if not attrs:
attrs = {}
attrs.setdefault('value', PrefilledPasswordInput.PASSWORD_ASTERIX_PLACEHOLDER)
super().__init__(attrs=attrs, *args, **kwargs)
模型字段:
class PasswordCharField(models.CharField):
def to_python(self, value):
return super().to_python(value)
def pre_save(self, model_instance, add):
attr_name = self.get_attname()
if not add:
# Reset to old value if matching with PASSWORD_ASTERIX_PLACEHOLDER
old_instance = self.model.objects.get(id=model_instance.id)
current_value: str = getattr(model_instance, attr_name)
if current_value == PrefilledPasswordInput.PASSWORD_ASTERIX_PLACEHOLDER:
old_value: str = getattr(old_instance, attr_name)
setattr(model_instance, attr_name, old_value)
return super().pre_save(model_instance, add)
您的管理员-(表单):
class UserForm(forms.ModelForm):
class Meta:
model = Org
fields = '__all__'
widgets = {
'password': PrefilledPasswordInput(),
}
你的模型:
class User(SomeBaseModel):
...
password = PasswordCharField(max_length=32, null=False, blank=False)