姜戈。 UserCreationForm 无法正确呈现
Django. UserCreationForm not rendering correctly
对我来说这很奇怪,也许不是,而且我遗漏了一些明显的东西:
forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class formRegistro(UserCreationForm):
class Meta:
model = User
fields = ("first_name", "last_name", "email", "username", "password1", "password2")
widgets = {
'first_name': forms.TextInput(attrs={'class':'form-control'}),
'last_name': forms.TextInput(attrs={'class':'form-control'}),
'email': forms.TextInput(attrs={'class':'form-control'}),
'username': forms.TextInput(attrs={'class':'form-control'}),
'password1': forms.PasswordInput(attrs={'class':'form-control'}),
'password2': forms.PasswordInput(attrs={'class':'form-control'})
}
views.py
def registro(request):
template = "perfiles/registro.html"
form = formRegistro()
context = {'form' : form}
return render(request, template, context)
html registro.html
<form class="form-horizontal" action="{% url 'perfiles:registro' %}" method="post">
{% csrf_token %}
<fieldset>
{{form}}
</fieldset>
<input type="submit" value="Submit">
</form>
我觉得不错,我只是在渲染一个表单。我只想将 "form-control" 添加到输入的 classes 中。奇怪的是,它只将 "form-control" 添加到字段 "first_name"、"last_name" 和 "email_address"。 ?¡ 输入 "username"、"password1" 和 "password2".
没有 form-control-class
这是渲染后的 html:
如果您查看 UserCreationForm
的源代码,您会看到这三个字段是声明性定义的:
class UserCreationForm(forms.ModelForm):
...
username = forms.RegexField(...)
password1 = forms.CharField(...)
password2 = forms.CharField(...)
...
根据 the documentation,您不能在 Meta
中覆盖它们:
Fields defined declaratively are left as-is, therefore any customizations made to Meta attributes such as widgets, labels, help_texts, or error_messages are ignored; these only apply to fields that are generated automatically.
因此,您最好的选择是将这些声明复制到您自己的 class 并覆盖那里的小部件选项。
更新:另一种选择是按照@catavaran 的建议修改表单的__init__
方法中的小部件属性。有关示例,请参阅 this answer。
对我来说这很奇怪,也许不是,而且我遗漏了一些明显的东西:
forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class formRegistro(UserCreationForm):
class Meta:
model = User
fields = ("first_name", "last_name", "email", "username", "password1", "password2")
widgets = {
'first_name': forms.TextInput(attrs={'class':'form-control'}),
'last_name': forms.TextInput(attrs={'class':'form-control'}),
'email': forms.TextInput(attrs={'class':'form-control'}),
'username': forms.TextInput(attrs={'class':'form-control'}),
'password1': forms.PasswordInput(attrs={'class':'form-control'}),
'password2': forms.PasswordInput(attrs={'class':'form-control'})
}
views.py
def registro(request):
template = "perfiles/registro.html"
form = formRegistro()
context = {'form' : form}
return render(request, template, context)
html registro.html
<form class="form-horizontal" action="{% url 'perfiles:registro' %}" method="post">
{% csrf_token %}
<fieldset>
{{form}}
</fieldset>
<input type="submit" value="Submit">
</form>
我觉得不错,我只是在渲染一个表单。我只想将 "form-control" 添加到输入的 classes 中。奇怪的是,它只将 "form-control" 添加到字段 "first_name"、"last_name" 和 "email_address"。 ?¡ 输入 "username"、"password1" 和 "password2".
没有 form-control-class这是渲染后的 html:
如果您查看 UserCreationForm
的源代码,您会看到这三个字段是声明性定义的:
class UserCreationForm(forms.ModelForm):
...
username = forms.RegexField(...)
password1 = forms.CharField(...)
password2 = forms.CharField(...)
...
根据 the documentation,您不能在 Meta
中覆盖它们:
Fields defined declaratively are left as-is, therefore any customizations made to Meta attributes such as widgets, labels, help_texts, or error_messages are ignored; these only apply to fields that are generated automatically.
因此,您最好的选择是将这些声明复制到您自己的 class 并覆盖那里的小部件选项。
更新:另一种选择是按照@catavaran 的建议修改表单的__init__
方法中的小部件属性。有关示例,请参阅 this answer。