Django自定义注册表单中密码输入字段无法正常渲染的问题咨询
问题产生原因
你遇到的密码字段不渲染的问题,核心是把Django的控件类和表单字段类混用了,具体错误点:
- 你写的
password = forms.PasswordInput()写法不对。forms.PasswordInput是专门用来渲染密码框样式的控件类,根本不是能直接当字段用的表单类。Django在初始化Form类的时候,只会把类属性里继承自forms.Field的实例收集成可在模板渲染的表单字段;如果扫到是控件(Widget)实例,会直接跳过不处理。最后你的RegisterForm里压根没有收集到password这个字段,模板里输出{{ form.password }}自然什么都不会显示。 - 代码里还有个容易漏的拼写错误:性别字段你写的是
forms.ChoicField,少了个e,正确的类名是forms.ChoiceField,哪怕这次运行没触发这个报错,后面跑的时候迟早出问题。
修正方法
密码字段本身就是字符串输入类,只要用forms.CharField做基础字段,把PasswordInput作为widget参数传进去就行,顺便把拼写错误改了,完整的可运行代码如下:
from django import forms class RegisterForm(forms.Form): username = forms.CharField() # 正确的密码字段写法 password = forms.CharField(widget=forms.PasswordInput()) email = forms.EmailField(label='E-Mail') # 修正ChoiceField的拼写 gender = forms.ChoiceField(choices=[('Male', 'male'), ('Female', 'female')])
补充:其余字段能正常显示的原因也很简单——username、email、gender都是正常用了对应的Field类,会被Django正常收集到表单字段列表里,只有密码字段错用了控件类,才会出现单独不渲染的情况。
内容的提问来源于stack exchange,提问作者Ecstasy
相关产品推荐
相关产品推荐

