django.forms 中缺少 TextField

76 投票
5 回答
65997 浏览
提问于 2025-04-17 01:26
from django import forms

class UserForm(forms.ModelForm):
    first_name = forms.TextField(label=_(u'First name'), required=False)
    last_name = forms.TextField(label=_(u'Last name'))

上面的代码让我遇到了一个错误,提示是“AttributeError: 'module' object has no attribute 'TextField'”。看起来其他地方都没问题,就是缺少了一个叫做TextField的东西。

ipdb> forms
<module 'django.forms' from '/usr/local/lib/python2.7/dist-packages/django/forms/__init__.pyc'>
ipdb> forms.
forms.BaseForm                        forms.EmailField                      forms.MultiWidget                     forms.TypedChoiceField
forms.BaseModelForm                   forms.Field                           forms.MultipleChoiceField             forms.TypedMultipleChoiceField
forms.BooleanField                    forms.FileField                       forms.MultipleHiddenInput             forms.URLField
forms.CharField                       forms.FileInput                       forms.NullBooleanField                forms.ValidationError
forms.CheckboxInput                   forms.FilePathField                   forms.NullBooleanSelect               forms.Widget
forms.CheckboxSelectMultiple          forms.FloatField                      forms.PasswordInput                   forms.fields
forms.ChoiceField                     forms.Form                            forms.RadioSelect                     forms.fields_for_model
forms.ClearableFileInput              forms.HiddenInput                     forms.RegexField                      forms.forms
forms.ComboField                      forms.IPAddressField                  forms.Select                          forms.formsets
forms.DEFAULT_DATETIME_INPUT_FORMATS  forms.ImageField                      forms.SelectMultiple                  forms.model_to_dict
forms.DEFAULT_DATE_INPUT_FORMATS      forms.IntegerField                    forms.SlugField                       forms.models
forms.DEFAULT_TIME_INPUT_FORMATS      forms.Media                           forms.SplitDateTimeField              forms.save_instance
forms.DateField                       forms.MediaDefiningClass              forms.SplitDateTimeWidget             forms.util
forms.DateInput                       forms.ModelChoiceField                forms.TextInput                       forms.widgets
forms.DateTimeField                   forms.ModelForm                       forms.Textarea                        
forms.DateTimeInput                   forms.ModelMultipleChoiceField        forms.TimeField                       
forms.DecimalField                    forms.MultiValueField                 forms.TimeInput          

有没有人知道这是怎么回事?

5 个回答

3

我想给像我这样的初学者补充一个更好的例子。正如上面提到的,ModelForm里没有TextFile这个选项。如果你需要用到它,在提问者的情况下,应该这样写:

first_name = forms.CharField(
     widget=forms.TextInput(attrs={'placeholder': 'first name'}),
     label=_(u'First name'), 
     required=False)

如果你需要一个文本区域来填写描述或评论,那你可以使用Textarea这个小工具:

description = forms.CharField(
     widget=forms.Textarea(attrs={'placeholder': 'Please enter the  description'}))
98

如果你想要一个文本区域,可以使用 forms.CharField 配合 forms.TextArea 这个工具。

class ContactForm(forms.Form):
    message = forms.CharField(widget=forms.Textarea)
97

CharField 可能正是你需要的东西。

编辑: 为了更清楚,文档提到 TextField 是一种模型字段类型。你不能把它当作表单字段来用。OP提到的表格显示,模型中的 TextField 在对应的 ModelForm 中会被表示为 CharField(并且使用 widget=forms.Textarea)。所以我想,可能没有默认小部件是 Textarea 的表单字段。

如果让我猜测 Django 为什么这样设计,我觉得他们可能认为,如果两个字段仅仅在使用的小部件上不同,而在存储的数据类型、验证等方面没有区别,那这样的设计就没什么意义。因此,你需要手动更改小部件。

撰写回答