Skip to main content
 首页 » 编程设计

python之Django UserCreationForm 自定义字段

2025年05月04日30xxx_UU

我正在尝试为用户注册创建表单并添加一些自定义字段。为此,我将 UserCretionForm 子类化并添加了字段,如 django 文档中所示。然后我基于这个表单创建了基于函数的 View 和模板。现在,我可以成功创建用户,并且该用户已按预期添加到管理面板。问题是,我无法为此表单的字段添加类和样式。除用户名字段外,小部件不工作。我在这里添加我的脚本是为了更准确地说明我的问题:

表单.py

from django import forms 
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm 
from django.contrib.auth.models import User 
 
 
class SignUpForm(UserCreationForm): 
    first_name = forms.CharField(max_length=32, help_text='First name') 
    last_name = forms.CharField(max_length=32, help_text='Last name') 
    email = forms.EmailField(max_length=64, help_text='Enter a valid email address') 
 
    class Meta(UserCreationForm.Meta): 
        model = User 
        # I've tried both of these 'fields' declaration, result is the same 
        # fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', ) 
        fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email',) 
 
        widgets = { 
            'username': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}), 
            'first_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}), 
            'last_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last Name'}), 
            'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email'}), 
            'password1': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'}), 
            'password2': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password Again'}), 
        } 

View .py

from django.contrib.auth import login, authenticate 
from django.contrib.auth.views import LoginView 
from django.shortcuts import render, redirect 
 
from .forms import SignUpForm, SignInForm 
 
 
def signup(request): 
    if request.method == 'POST': 
        form = SignUpForm(request.POST) 
        if form.is_valid(): 
            form.save() 
            username = form.cleaned_data.get('username') 
            raw_password = form.cleaned_data.get('password1') 
            user = authenticate(username=username, password=raw_password) 
            login(request, user) 
            return redirect('/') 
    else: 
        form = SignUpForm() 
    return render 

除“用户名”字段外,“forms.py”中的小部件无法正常工作。换句话说,在网络浏览器中,“用户名”输入显示为“class='form-control'”和“placeholder='Username'”,但其他字段没有我预期的类和占位符属性。可能是什么原因?

请您参考如下方法:

您不需要在小部件下定义字段。在类级别将它们定义为静态。

class SignUpForm(UserCreationForm): 
    username = forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'})) 
    first_name = forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}), max_length=32, help_text='First name') 
    last_name=forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last Name'}), max_length=32, help_text='Last name') 
    email=forms.EmailField(forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email'}), max_length=64, help_text='Enter a valid email address') 
    password1=forms.CharField(forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'})) 
    password2=forms.CharField(forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password Again'})) 
 
    class Meta(UserCreationForm.Meta): 
        model = User 
        # I've tried both of these 'fields' declaration, result is the same 
        # fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', ) 
        fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email',)