Django模型表单加form-control类报错:'CharField'无'use_required_attribute'属性
问题原因与解决方法
错误根源
你遇到的AttributeError: 'CharField' object has no attribute 'use_required_attribute',是因为在get_form方法中错误地将**表单字段对象(forms.CharField)**赋值给了字段的widget属性。widget需要的是表单控件类的实例(比如forms.TextInput),而不是字段类,Django渲染表单时会调用widget的方法,字段对象没有这些方法,因此报错。
另外,你在language和country字段的赋值语句末尾多了逗号,导致这两个字段的widget被设置成了元组((forms.CharField(...),)),这也会引发异常。
修正方案
修改TweetCreate类中的get_form方法,正确设置widget:
方法一:直接更新现有widget的属性(推荐)
这种方式保留模型字段对应的默认widget,仅添加form-control类:
class TweetCreate(LoginRequiredMixin, CreateView): model = TweetSearch fields = ['search_term', 'query_type', 'start_date', 'end_date', 'language', 'country'] def get_form(self): form = super().get_form() # 给每个字段的widget添加form-control类 form.fields['search_term'].widget.attrs.update({'class': 'form-control'}) # query_type默认是Select控件(因为模型里有choices),如果要保留下拉选择,直接加class form.fields['query_type'].widget.attrs.update({'class': 'form-control'}) # 如果一定要把query_type改成文本输入,才用下面这句替换: # form.fields['query_type'].widget = forms.TextInput(attrs={'class': 'form-control'}) form.fields['start_date'].widget.attrs.update({'class': 'form-control'}) form.fields['end_date'].widget.attrs.update({'class': 'form-control'}) form.fields['language'].widget.attrs.update({'class': 'form-control'}) form.fields['country'].widget.attrs.update({'class': 'form-control'}) return form
方法二:替换为新的widget实例
如果你需要替换默认的widget类型(比如把Select改成TextInput),则直接赋值控件实例,而不是字段:
class TweetCreate(LoginRequiredMixin, CreateView): model = TweetSearch fields = ['search_term', 'query_type', 'start_date', 'end_date', 'language', 'country'] def get_form(self): form = super().get_form() form.fields['search_term'].widget = forms.TextInput(attrs={'class': 'form-control'}) # 替换query_type的widget为TextInput(如果需要的话) form.fields['query_type'].widget = forms.TextInput(attrs={'class': 'form-control'}) form.fields['start_date'].widget = DateTimePickerInput(attrs={'class': 'form-control'}) form.fields['end_date'].widget = DateTimePickerInput(attrs={'class': 'form-control'}) form.fields['language'].widget = forms.TextInput(attrs={'class': 'form-control'}) form.fields['country'].widget = forms.TextInput(attrs={'class': 'form-control'}) # 注意:去掉末尾的逗号 return form
额外注意事项
- 确保
DateTimePickerInput已正确导入(如果是第三方库比如django-bootstrap-datepicker-plus,需确认安装并导入)。 query_type模型字段带有choices,默认widget是forms.Select,如果不需要改成文本输入,推荐用方法一直接添加class,保留下拉选择功能。
内容的提问来源于stack exchange,提问作者JelleHeijne
相关产品推荐
相关产品推荐

