You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django表单模型添加自定义类报错:TypeError: __init__()意外参数'attrs'

解决Django表单添加自定义类时的TypeError问题

嘿,这个报错我太熟悉啦!你遇到的TypeError: __init__() got an unexpected keyword argument 'attrs',本质上是把attrs参数传错地方了——attrs是给表单字段的**widget(小部件)**用的,不是直接传给表单字段或者模型字段的。

我给你拆解两种最常见的错误场景和对应的正确写法:

场景1:使用ModelForm时的错误

错误写法示例(你可能这么写了)

from django import forms
from .models import YourModel

class YourForm(forms.ModelForm):
    class Meta:
        model = YourModel
        fields = ['username']
        # 错误:把attrs直接传给了CharField,而不是它的widget
        widgets = {
            'username': forms.CharField(attrs={'class': 'form-control'})
        }

或者单独定义字段时的错误:

class YourForm(forms.ModelForm):
    # 错误:直接给CharField传attrs参数
    username = forms.CharField(attrs={'class': 'form-control'})

    class Meta:
        model = YourModel
        fields = ['username']

正确写法

attrs必须传给具体的widget(比如TextInput、Textarea等),而不是字段本身:

from django import forms
from .models import YourModel

class YourForm(forms.ModelForm):
    class Meta:
        model = YourModel
        fields = ['username']
        widgets = {
            # 正确:将attrs传给TextInput widget
            'username': forms.TextInput(attrs={'class': 'form-control custom-class'})
        }

如果是单独定义字段:

class YourForm(forms.ModelForm):
    # 正确:通过widget参数传递attrs
    username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))

    class Meta:
        model = YourModel
        fields = ['username']

场景2:使用普通Form时的错误

和ModelForm的逻辑完全一致,别把attrs直接给字段:

错误写法

from django import forms

class ContactForm(forms.Form):
    message = forms.CharField(attrs={'class': 'message-box'})  # 错误!

正确写法

from django import forms

class ContactForm(forms.Form):
    message = forms.CharField(widget=forms.Textarea(attrs={'class': 'message-box', 'rows': 5}))

额外提醒

如果你是自定义了表单字段,那可能需要在自定义字段的__init__方法里处理widget的attrs,但这种情况比较少见。绝大多数时候,都是上面说的「把attrs传给了字段而非widget」的问题。

按照这个思路调整你的代码,应该就能解决报错啦!

内容的提问来源于stack exchange,提问作者Kaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:08:41