Django的。 UserCreationForm无法正确呈现

时间:2015-03-13 00:23:59

标签: python django django-forms

对我而言,这很奇怪,也许不是,我遗漏了一些明显的东西:

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>

我看起来很好,我只是在渲染表格。我想要的只是在输入的类中添加“表单控件”。奇怪的是,它只在“first_name”,“last_name”和“email_address”字段中添加了“form-control”。 ?¡输入“username”,“password1”和“password2”没有表单控制类。

这是渲染的html: screenshot

1 个答案:

答案 0 :(得分:3)

如果查看UserCreationForm的源代码,您会看到这三个字段是以声明方式定义的:

class UserCreationForm(forms.ModelForm):
    ...
    username = forms.RegexField(...)
    password1 = forms.CharField(...)
    password2 = forms.CharField(...)
    ...

根据the documentation,您无法在Meta中覆盖它们:

  

以声明方式定义的字段保持原样,因此忽略对元素属性(如窗口小部件,标签,help_texts或error_messages)所做的任何自定义;这些仅适用于自动生成的字段。

因此,您最好的选择是将这些声明复制到您自己的类中,并覆盖那里的窗口小部件选项。

更新:另一个选项是修改表单的__init__方法中的小部件属性,如@catavaran建议的那样。有关示例,请参阅this answer