2010-05-25 10 views
83

Mam pole tekstowe, które jest renderowany z szablonem tak:Django: Jak dodać dowolne atrybuty html do pól wejściowych w formularzu?

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

która jest uznana jako:

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

Teraz załóżmy, że chcemy dodać atrybut autocomplete="off" do elementu wejściowego, który jest renderowane, jak bym to zrobił? Lub onclick="xyz()" lub class="my-special-css-class"?

Odpowiedz

109

Check this page

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

Dobra, dziękuję. W moim przypadku używam ModelForm, więc nie jestem jednoznacznie definiowania pól formularza (np. Klasa AddressForm (forms.ModelForm): klasa Meta: model = models.Address ) Czy to oznacza, że ​​nie mogę używać ModelForm lub jest tam coś specjalnego, co muszę zrobić? – User

+0

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

+30

Dokumentacja django to labirynt. Łatwo się zgubić. – Galen

96

Przepraszamy za advertisment, ale ja niedawno wydała aplikację (https://github.com/kmike/django-widget-tweaks) sprawia, że ​​takie zadania nawet mniej bolesne, więc projektanci mogą to zrobić bez dotykania kodu python:

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

lub opcjonalnie:

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

Dobra aplikacja Mike, właśnie tego szukałem! – jmagnusson

+0

Dokumentacja nie mówi, aby dodać "widget_tweaks" do zainstalowanej aplikacji w ustawieniach, może warto włożyć to do dokumentacji. –

+0

Cześć James, to nie jest zestresowane, ale w sekcji "Instalacja" jest już notatka o dodaniu "widget_tweaks" do INSTALLED_APPS. –

22

Jeśli jesteś 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

Dobrze! Nie trzeba teraz jawnie definiować wszystkich widgetów. – Mikuz

11

Jeśli używasz ModelForm, oprócz możliwości korzystania z __init__ jak @Artificioo przewidziane w jego odpowiedź, nie jest słownikiem widgets w Meta dla tej sprawy:

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

Relevant documentation

+1

Próbuję dowiedzieć się, dlaczego jest to mniej popularne niż odpowiedź powyżej ... czasami myślę, że programiści Django/Python wolą trudniejszy sposób robienia rzeczy ... – trpt4him

+0

@ trpt4him Korzystanie z podejścia __init__ jest przydatne do tworzenia Mixin lub bazy Klasa, którą można ponownie wykorzystać w innych formularzach. Jest to typowe w przypadku projektu od średniej do dużej skali. Meta.widgets jest świetny dla pojedynczego formularza. Obie są więc dobrymi odpowiedziami. – Akhorus

Powiązane problemy