2011-09-05 11 views
41
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')) 

Me da un "AttributeError: 'módulo' objeto no tiene atributo 'TextField' Todo parece estar bien, excepto el campo de texto que falta:.TextField desaparecidos en django.forms

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   

Alguna idea?

+2

'forms.TextInput' no es lo que necesita? – Nemoden

+1

No. TextInput es el widget utilizado por campo. – zVictor

Respuesta

70

CharField podría ser lo que buscas.

ED IT: Para aclarar, los documentos mencionan TextField como un tipo de campo modelo. No puede usarlo como campo de formulario. El table que señaló el OP indica que TextField en un modelo se representa como CharField (con widget=forms.Textarea) en un ModelForm correspondiente. Me imagino, entonces, que no hay un campo de formulario con Textarea como su widget predeterminado.

Si tuviera que adivinar por qué Django hizo esta elección, diría que tener dos campos que difieran solo en el widget que usan, no en el tipo de datos almacenados, validación, etc. puede ser considerado inútil por el personas en Django y, por lo tanto, debe cambiar manualmente el widget.

+1

No. Quiero un área de texto, no una entrada de texto. Según https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#field -types: TextField es un CharField con widget = forms.Textarea – zVictor

+0

Me parece, entonces, que acabas de responder tu propia pregunta No parece que haya ningún campo con Textarea como widget predeterminado. A menos que proporcione una longitud máxima o mínima, todas las entradas son válidas, de acuerdo con los documentos. – Umang

+0

No. ¿No ve TextField en esta [tabla] (https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#field -types)? – zVictor

0

forms.TextField no existe, consulte la documentación a la que se refiere, es solo para los modelos.

Puede probar esto a usted mismo mirando la fuente de django real django/forms/fields.py.

Debe usar CharField con widget = forms.TextArea como dice en sus comentarios.

+1

No veo en ninguna parte de la documentación que diga que hay 'forms.TextField'. Hay un 'models.TextField' y lo hago [verlo en los documentos] (https://docs.djangoproject.com/en/1.3/ref/models/fields/#textfield). – Umang

+3

Esto no es un error de documentación, ya que no hay documentos que se refieran a forms.TextField. –

42

Si desea un área de texto, puede usar los formularios.CharField con el widget forms.TextArea.

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

Esta debería ser la respuesta aceptada.El otro en realidad no responde la pregunta que la mayoría de las personas que vienen aquí tienen: * ¿Cómo agregar un campo de texto en sus formularios? * – Serafeim

1

Sólo quiero añadir un mejor ejemplo para los principiantes como yo, como todo lo mencionado anteriormente, no hay archivo de texto para ModelForm, y si hay que usarla, para el caso de la OP, debe ser:

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

Y si usted no necesita un campo de área de texto de descripción o comentario, entonces se puede utilizar widget de Área de texto:

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