2010-05-25 14 views
83

que tienen un campo de entrada que se representa con una plantilla de este modo:Django: ¿Cómo agrego atributos html arbitrarios para ingresar campos en un formulario?

<div class="field"> 
    {{ form.city }} 
</div> 

la que se representa como:

<div class="field"> 
    <input id="id_city" type="text" name="city" maxlength="100" /> 
</div> 

Ahora supongamos que quiero añadir un atributo autocomplete="off" al elemento de entrada que es rendido, ¿cómo lo haría? O onclick="xyz()" o class="my-special-css-class"?

Respuesta

109

Check this page

city = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'})) 
+2

Bien, gracias. En mi caso estoy usando ModelForm así que no estoy definiendo explícitamente los campos del formulario (por ejemplo, clase AddressForm (forms.ModelForm): class Meta: model = models.Address ) ¿Esto significa que no puedo usar ModelForm o hay algo especial que necesito hacer? – User

+0

ok nevermind, rtfm: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/ – User

+30

Los documentos de django son un laberinto. Es fácil perderse – Galen

96

Lo sentimos para el anuncio, pero me he lanzado recientemente una aplicación (https://github.com/kmike/django-widget-tweaks) que hace que este tipo de tareas, incluso menos doloroso que los diseñadores puedan hacerlo sin tocar el código Python:

{% load widget_tweaks %} 
... 
<div class="field"> 
    {{ form.city|attr:"autocomplete:off"|add_class:"my_css_class" }} 
</div> 

o, alternativamente,

{% load widget_tweaks %} 
... 
<div class="field"> 
    {% render_field form.city autocomplete="off" class+="my_css_class" %} 
</div> 
+2

Bonita aplicación Mike, ¡justo lo que estaba buscando! – jmagnusson

+0

la documentación no le dice que agregue "widget_tweaks" en su aplicación instalada en la configuración, podría valer la pena poner eso en la documentación. –

+0

Hola, James, no está estresado pero en la sección 'Instalación' ya hay una nota sobre cómo agregar 'widget_tweaks' a INSTALLED_APPS. –

22

Si usted está usi ng "ModelForm":

class YourModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(YourModelForm, self).__init__(*args, **kwargs) 
     self.fields['city'].widget.attrs.update({ 
      'autocomplete': 'off' 
     }) 
+1

¡Bien! No es necesario definir explícitamente todos los widgets ahora. – Mikuz

11

Si está utilizando ModelForm, aparte de la posibilidad de utilizar como __init__ @Artificioo proporciona en su respuesta, existe un diccionario widgets en el Meta para el caso:

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title', 'birth_date') 
     widgets = { 
      'name': Textarea(attrs={'cols': 80, 'rows': 20}), 
     } 

Relevant documentation

+1

Tratando de averiguar por qué esto obtuvo menos votos positivos que la respuesta anterior ... a veces creo que los desarrolladores de Django/Python simplemente prefieren la forma más difícil de hacer las cosas ... – trpt4him

+0

@ trpt4him Usar el enfoque __init__ es útil para crear un Mixin o Base Clase que puede reutilizar en otras formas. Esto es típico en un proyecto de mediana a gran escala. Los Meta.widgets son geniales para un solo Formulario. Entonces, ambas son buenas respuestas. – Akhorus

Cuestiones relacionadas