Django: Как добавить произвольные атрибуты HTML в поля ввода в форме? - PullRequest
95 голосов
/ 25 мая 2010

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

<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"?

Ответы [ 6 ]

119 голосов
/ 25 мая 2010

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

city = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}))
107 голосов
/ 12 января 2011

Извините за рекламу, но я недавно выпустил приложение (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>
29 голосов
/ 12 января 2015

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

class YourModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourModelForm, self).__init__(*args, **kwargs)
        self.fields['city'].widget.attrs.update({
            'autocomplete': 'off'
        })
18 голосов
/ 24 марта 2015

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

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

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

1 голос
/ 06 января 2019

Я не хотел использовать целое приложение для этой вещи. Вместо этого я нашел следующий код здесь https://blog.joeymasip.com/how-to-add-attributes-to-form-widgets-in-django-templates/

# utils.py
from django.template import Library
register = Library()

@register.filter(name='add_attr')
def add_attr(field, css):
    attrs = {}
    definition = css.split(',')

    for d in definition:
        if ':' not in d:
            attrs['class'] = d
        else:
            key, val = d.split(':')
            attrs[key] = val

    return field.as_widget(attrs=attrs)

использовать тег в html-файле

{% load utils %}
{{ form.field_1|add_attr:"class:my_class1 my_class2" }}
{{ form.field_2|add_attr:"class:my_class1 my_class2,autocomplete:off" }}
0 голосов
/ 16 марта 2019

Я столкнулся с той же проблемой и смог решить ее следующим образом: Я следовал за кодом в этой ссылке и добавил небольшую модификацию https://blog.joeymasip.com/how-to-add-attributes-to-form-widgets-in-django-templates/

Лето:

Шаг 1: создайте файл с именем add_attr.py и поместите его в папку templatetags внутри вашего приложения

Шаг 2: добавьте следующий код в add_attr.py

from django.template import Library
register = Library()

@register.filter(name='add_attr')
def add_attr(field, css):
    attrs = {}
    definition = css.split(',')

    for d in definition:
        if '=' not in d:
            attrs['class'] = d
        else:
            key, val = d.split('=')
            attrs[key] = val
    return field.as_widget(attrs=attrs)

Шаг 3: Использование тега следующим образом: загрузить тег:

{% load add_attr %}

пример:

<input type="email" id="defaultLoginFormEmail" class="form-control mb-4" placeholder="E-mail">

становится

{{ form.email|add_attr:'id=defaultLoginFormEmail,class=form-control mb-4,placeholder=E-mail' }}
...