Django: Как добавить произвольные атрибуты HTML в поля ввода в форме?

76

У меня есть поле ввода, которое отображается с таким шаблоном:

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

Что отображается как:

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

Теперь предположим, что я хочу добавить атрибут autocomplete = "off" к отображаемому элементу ввода, как бы я это сделал? Или onclick = "xyz()" или class= "my-special-css-class"?

Теги:
django-templates
django-forms
django-widget

4 ответа

112
Лучший ответ

Проверить эту страницу

city = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}))
  • 2
    Спасибо. В моем случае я использую ModelForm, поэтому я не определяю явно поля формы (например, класс AddressForm (forms.ModelForm): класс Meta: model = models.Address) Означает ли это, что я не могу использовать ModelForm или есть что-то особенное? нужно сделать?
  • 0
    ок, неважно, rtfm: docs.djangoproject.com/en/dev/topics/forms/modelforms
Показать ещё 7 комментариев
94

Извините за рекламу, но я недавно выпустил приложение (https://github.com/kmike/django-widget-tweaks), что делает такие задачи еще менее болезненными, поэтому дизайнеры могут это сделать, не касаясь кода на Python

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

или, альтернативно,

{% load widget_tweaks %}
...
<div class="field">
   {% render_field form.city autocomplete="off" class+="my_css_class" %}
</div>
  • 2
    Хорошее приложение, Майк, именно то, что я искал!
  • 0
    документация не говорит вам, чтобы добавить "widget_tweaks" в ваше установленное приложение в настройках, возможно, стоит добавить это в документацию.
Показать ещё 6 комментариев
21

Если вы используете "ModelForm":

class YourModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourModelForm, self).__init__(*args, **kwargs)
        self.fields['city'].widget.attrs.update({
            'autocomplete': 'off'
        })
  • 2
    Хорошо! Нет необходимости явно определять все виджеты сейчас.
10

Если вы используете ModelForm, помимо возможности использования __init__ в качестве @Artificioo, предоставленного в его ответе, есть словарь widgets в Meta:

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

Соответствующая документация

  • 1
    Пытаясь выяснить, почему это вызвало меньше голосов, чем ответ выше ... иногда я думаю, что разработчики Django / Python просто предпочитают более сложный способ ведения дел ...
  • 0
    @ trpt4him Использование подхода init полезно для создания Mixin или Base Class, который вы можете повторно использовать в других формах. Это типично для средних и крупных проектов. Meta.widgets отлично подходит для одной формы. Итак, оба являются хорошими ответами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню