嗨,我正在使用带有某些字段和密码字段的 django 模型类。我不想显示常规的纯文本,而是想显示密码输入。我创建了一个像这样的模型类:
class UserForm(ModelForm):
class Meta:
password = forms.CharField(widget=forms.PasswordInput)
model = User
widgets = {
'password': forms.PasswordInput(),
}
但我收到以下错误:NameError:名称“forms”未定义。
我使用的是 django 1.4.0 版本。我点击了这个链接:Django 密码问题
仍然遇到同样的错误。我应该怎么办。我哪里错了。请帮忙
小部件需要是函数调用,而不是属性。你漏掉了括号。
class UserForm(ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
class Meta:
model = User
您需要在导入中包含以下内容;
from django import forms
为什么不创建自己的密码字段,以便在所有模型中使用。
from django import forms
class PasswordField(forms.CharField):
widget = forms.PasswordInput
class PasswordModelField(models.CharField):
def formfield(self, **kwargs):
defaults = {'form_class': PasswordField}
defaults.update(kwargs)
return super(PasswordModelField, self).formfield(**defaults)
所以现在在你的模型中使用
password = PasswordModelField()
@Tyrsa 博士是正确的。别忘了你的括号。
from django.forms import CharField, Form, PasswordInput
class UserForm(Form):
password = CharField(widget=PasswordInput())
我按照以下方式做了,没有任何额外的导入
from django import forms
class Loginform(forms.Form):
attrs = {
"type": "password"
}
password = forms.CharField(widget=forms.TextInput(attrs=attrs))
这个想法来自源代码: https://docs.djangoproject.com/en/2.0/_modules/django/forms/fields/#CharField
由于这个问题是几年前提出的,并且它在搜索结果上有很好的索引,因此这个答案可能会帮助一些遇到同样问题但使用更新版本 Django 的人。
我正在使用 Django 1.11 但它也应该适用于 Django 2.0。
考虑到您使用模型用户,我将假设您使用的是 Django 中的默认 User() 模型。
由于 User() 模型已经有一个密码字段,我们只需向其中添加一个小部件即可。
from django import forms
from django.contrib.auth.models import User
# also, it will work with a custom user model if needed.
# from .models import User
class UserRegistrationForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'password']
widgets = {
# telling Django your password field in the mode is a password input on the template
'password': forms.PasswordInput()
}
我对 Django 相当陌生,如果我的答案不够准确,请告诉我们,我很乐意稍后对其进行编辑。
尝试使用这个
password1 = forms.CharField(widget=forms.PasswordInput(attrs={
'class': 'input-text with-border', 'placeholder': 'Password'}))
password2 = forms.CharField(widget=forms.PasswordInput(attrs={
'class': 'input-text with-border', 'placeholder': 'Repeat Password'}))
非常简单。
您应该从
password
类中获得 Meta
表单字段。
OP 在
password = forms.Charfield(widget=forms.PasswordInput)
所写的内容是正确的。它只是不属于 class Meta:
部分。相反,它应该在它上面,在下面缩进一级 class UserForm
....
如果字段可为空,则上述解决方案有效。使用
render_value
会将密码呈现到输入字段中,并将该值显示为星号占位符。
注意:如果您只是想向用户隐藏密码,那么这非常有用,但密码可以通过使用 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)
from django import forms
class loginForm(forms.Form):
username = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter Your userName'}))
password = forms.CharField(
widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'please enter password'}))