Django - Как добавить атрибуты HTML в формы на шаблонах - PullRequest
5 голосов
/ 10 февраля 2011

Предположим, у меня есть следующий шаблон:

<div id="openid_input_area">
{{ form.openid_identifier }}
    <input name="bsignin" type="submit" value="{% trans "Sign in" %}">
</div>

Как добавить класс css в form.openid_identifier?

Поскольку я придерживаюсь принципов SOC и ожидаю, что дизайнеры улучшат шаблоны, которые я делаю НЕ хочу сделать это на модели формы, но на самом шаблоне.

Я не смог найти ничего по этому поводу в документах. Есть ли способ сделать это на шаблоне?

Ответы [ 2 ]

17 голосов
/ 10 февраля 2011

Мне удалось написать простое решение моей проблемы:

Я написал пользовательский тег шаблона :

from django import template

register = template.Library()

def htmlattributes(value, arg):
    attrs = value.field.widget.attrs


    data = arg.replace(' ', '')   

    kvs = data.split(',') 

    for string in kvs:
        kv = string.split(':')
        attrs[kv[0]] = kv[1]

    rendered = str(value)

    return rendered

register.filter('htmlattributes', htmlattributes)

И все, что мне нужно сделать по шаблону:

{{ form.openid_identifier|htmlattributes:"class : something, id: openid_identifier" }}
2 голосов
/ 10 февраля 2011

Я не знаю другого пути в простом Джанго. Ярлыки типа form.field или form.as_p действительно помогают вам начать работу, но в конце концов вы можете использовать простой HTML. Вот как я это вижу. Не сказать, что нет необходимости в большем контроле над рендерингом. Я помню, как читал эту дискуссию о рендеринге форм в списке рассылки Django.

Саймон Виллисон работает над библиотекой, чтобы предоставить дизайнерам больше контроля, ее источник можно найти на github . Это немного старше, так что может даже не работать. Но что касается вашего вопроса, этот пример выглядит как полезный для вас:

{% field form.name class="myclass" %}
<!-- renders as -->
<input type="text" name="name" id="id_name" class="myclass">

На самом деле эта функция должна быть легко достижимой. Вам нужен тег шаблона, который принимает поле формы, обновляет атрибуты виджетов (те, которые вы уже можете установить в форме) и визуализируете поле.

Итерация по форме дает экземпляры BoundField, которые визуализируются с помощью метода __unicode__. Вам нужно будет передать все ключевые аргументы в функцию визуализации виджетов. Черновик этой идеи:

@register.simple_tag
def field(boundfield, **kwargs):
    if self.field.show_hidden_initial:
        return self.as_widget(attrs=kwargs) + self.as_hidden(only_initial=True)
    return self.as_widget(attrs=kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...