2010-05-25 10 views
83

Ho un campo di input che è resa con un modello in questo modo:Django: come aggiungere attributi HTML arbitrari ai campi di input di un modulo?

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

Che viene reso come:

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

Supponiamo ora voglio aggiungere un attributo autocomplete="off" all'elemento input che è reso, come lo farei? O onclick="xyz()" o class="my-special-css-class"?

risposta

109

Check this page

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

Ok grazie. Nel mio caso sto usando ModelForm quindi non sto definendo esplicitamente i campi del modulo (ad es. Classe AddressForm (forms.ModelForm): classe meta: model = models.Address ) Questo significa che non posso usare ModelForm o c'è qualcosa di speciale che devo fare? – User

+0

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

+30

I documenti di django sono un labirinto. È facile perdersi – Galen

96

Siamo spiacenti per la pubblicità, ma ho recentemente rilasciato un app (https://github.com/kmike/django-widget-tweaks) che rende tali compiti ancor meno dolorosa modo i progettisti possono farlo senza toccare il codice Python:

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

o, in alternativa,

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

Bella app Mike, proprio quello che stavo cercando! – jmagnusson

+0

la documentazione non ti dice di aggiungere "widget_tweaks" nella tua app installata nelle impostazioni, potrebbe valere la pena metterlo nella documentazione. –

+0

Ciao James, non è sottolineato, ma nella sezione "Installazione" c'è già una nota sull'aggiunta di "widget_tweaks" a INSTALLED_APPS. –

22

Se sei 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

Buono! Non è necessario definire esplicitamente tutti i widget ora. – Mikuz

11

Se si utilizza ModelForm, a parte la possibilità di utilizzare come __init__ @Artificioo previsto nella sua risposta, c'è un dizionario widgets a Meta per quella materia:

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

Relevant documentation

+1

Cercando di capire perché questo ha ottenuto meno upvotes rispetto alla risposta sopra ... a volte penso che gli sviluppatori Django/Python preferiscano il modo più difficile di fare le cose ... – trpt4him

+0

@ trpt4him L'utilizzo dell'approccio __init__ è utile per creare un Mixin o Base Classe che è possibile riutilizzare in altri moduli. Questo è tipicamente in un progetto di scala medio-grande. Meta.widgets è ottimo per un singolo modulo. Quindi, entrambe sono buone risposte. – Akhorus