Как в Django создать свой «пак» форм?

На сайте много повторяющихся крудов, формы для которых очень лениво писать-копировать. И хочется рендерить свои формы одним тэгом (ну или фильтром).
Есть у джанго форм as_t, as_p, а в crispy_forms и as_div (который убоговат).

Есть ли возможность создать шаблоны для каждого типа Fieldов (со всеми нужными атрибутами, инициализаций js-виджетов и т.д.), положить их куда-нибудь и рендерить на странице форму из них? Видел в документации, что в каждое поле можно класть класс виджета, но уж больно не красиво, да и смешивание логики - не хорошо в обработчике формы писать, как она выглядит.
  • Вопрос задан
  • 3136 просмотров
Пригласить эксперта
Ответы на вопрос 2
@TheGhost777
python web dev
Можно попробовать создать одну форму, и остальные наследовать от нее, тут же можно переписать любые методы формы.
Можно написать свой form.as_my_form, или рендерить форму в кастомном фильтре.
Ответ написан
Комментировать
UPDATE: Я вынес в код в отдельную библиотеку - https://github.com/viewflow/viewform

Доступно через pypi: pip install django-viewform

------------------

Можно воспользоваться пакетом django-floppy-forms и определить свои шаблоны для стандартных и нестандартных виджетов - django-floppyforms.readthedocs.org/en/latest/custo...

К сожалению, как показывает моя практика. этого часто недостаточно. Сразу после того как сделан кастомный рендеринг виджетов, появляются хотелки наподобие - "а в этой форме отрендерить этот виджет вот также, но чуть-чуть по другому", Например добавить bootstrap prepend значок к полю ввода.

С floppy-forms приходится лезть в пайтон код, что кажется немного оверхедом.

Я начал делать свой вариант, позволяющий переопеделять и дефолтный рендеринг виджетов, и при необходимости в шаблоне конкретной формы тут же менять какие-то детали.

Общая идея, как с наследованием блоков, но блоки создаются динамически и для каждого поля.
И каждый блок можно переопределить, внутри шаблона конкретной формы:

{% viewform 'viewform/bootstrap3/form.html' form=form layout=view.layout %}
        {% viewpart field_icon 'my_field_name' %}
        <span class="glyphicon glyphicon glyphicon-pencil form-control-feedback"></span>
        {% endviewpart %}
    {% endviewform %}


Отдельным пакетом пока этого нет, но как реализовано можно уже посмотреть тут - https://github.com/kmmbvnr/django-viewflow/blob/ma...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы