Django表单中缺少TextField

76
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          

有什么想法吗?


2
forms.TextInput 不是你需要的吗? - Nemoden
1
不是的。TextInput 是用于字段的小部件。 - zVictor
5个回答

98

如果你想要一个文本域,你可以使用 forms.CharField 和 forms.TextArea 小部件。

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

4
这应该是被采纳的答案。其他回答实际上并没有回答大多数来到这里的人的问题:如何在你的表单中添加文本字段! - Serafeim

97

CharField可能是你要找的。

编辑:澄清一下,文档中提到TextField是模型字段类型。你不能将其用作表单字段。OP指出的表格表明模型中的TextField在相应的模型表单中表示为一个CharField(带有widget=forms.Textarea)。我想,因此没有默认小部件为Textarea的表单字段。

如果我要猜测Django为什么做出这个选择,我会说拥有两个仅在使用的小部件上不同,而不是在存储数据类型、验证等方面不同的字段,可能被Django的人认为是无用的,所以你必须手动更改小部件。


2
不,我想要一个文本区域而不是文本输入框。根据https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#field-types: TextField是一个带有widget=forms.Textarea的CharField。 - zVictor
那么,我觉得你已经回答了自己的问题。看起来没有任何字段默认使用Textarea作为小部件。除非您提供最大或最小长度,否则根据文档,所有输入都是有效的。 - Umang
不是吧,你没看到这个表格里有TextField吗? - zVictor
15
是的,但是那些字段是为了模型而非表单而设定的。 - Umang
1
说实话,他们应该在表单中也包含TextField,以便于textarea。 - MohitC

3

我想为像我这样的初学者添加一个更好的示例,就像上面提到的那样,ModelForm没有TextFile,如果你需要使用它,对于OP的情况,应该是:

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'}))

0

只需使用forms.Textarea而不是forms.TextInput


1
在Django的新版本中,这已经不再是一个选项了,你只能使用CharField: https://docs.djangoproject.com/en/3.0/ref/forms/fields/#built-in-field-classes - Apollo Data

0

forms.TextField不存在,请查看您所参考的文档,它仅适用于模型。

您可以通过查看实际的django源代码django/forms/fields.py来证明这一点。

您必须像您在评论中所说的那样使用CharField与widget=forms.TextArea。


1
我在文档中没有看到有forms.TextField的说明。有一个models.TextField,我在文档中看到了它。 - Umang
4
这不是文档错误,因为没有文档涉及到 forms.TextField。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接