1. aaleksander

    15.03.2010

    0 ↑
    0 ↓
    Исправить бы название "Шаблонизатор и ВЛОЖЕННЫЕ тэги"

    Всем доброго времени суток.
    Что-то затык у меня приключился.
    Сделал свой тэг для вывода некоего блока с заголовком.
    Текста заголовка передается в виде параметра
    {% beginform "это заголовок" %}
    ....
    {% endform %}
    Все было классно, до тех пор пока я не попробовал вывести в заголовке переменную из представления:
    views.py:
    { ... 'mycaption': u'Это заголовок' ... }

    templ.html:
    {% beginform mycaption %}
    Уже по всякому пытался, не выводит как надо.
    Может я что-то не так делаю?
  2. Исправить бы название "Шаблонизатор и ВЛОЖЕННЫЕ тэги"

    Вы можете сами исправить название кликнув на карандаш справа от него.

    Уже по всякому пытался, не выводит как надо.

    Как выводит и как надо?

    Как вы делаете тег?

  3. aaleksander

    15.03.2010

    0 ↑
    0 ↓
    Сейчас не могу проверить, локальный сервер как-то странно работает (html берет из запущенного проекта, а ресурсы - из предыдущего). Что-то порушилось.

    Делал так:
    @register.inclusion_tag('beginform.html', takes_context=False)
    def beginform(caption, width, height=0):
    return {'caption': caption, 'width': width, 'height': height}

    @register.inclusion_tag('endform.html', takes_context=False)
    def endform():
    return {}
    Внутри шаблонов - несколько дивов, ничего особенного.
    пробовал так:
    {% beginform {{caption }} %}
    он так и пишет "{{ caption }}"
    Если писать, например так:
        {% beginform "Это заголовок" %}
    То все работает как надо. Но охота сделать его динамическим.
  4. Иван Сагалаев

    15.03.2010

    0 ↑
    0 ↓

    Делал так:

    @register.inclusion_tag('beginform.html', takes_context=False)
    def beginform(caption, width, height=0):
        return {'caption': caption, 'width': width, 'height': height}
    
    @register.inclusion_tag('endform.html', takes_context=False)
    def endform():
        return {}
    

    Таким образом вы сделали два отдельных тега, которые никак не связаны с тем, что между ними. Это действительно то, что вам надо?

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

  5. задумчиво так

    Интересно, а что делает волшебный параметр takes_context=False?

  6. aaleksander

    16.03.2010

    0 ↑
    0 ↓
    Таким образом вы сделали два отдельных тега, которые никак не связаны с тем, что между ними. Это действительно то, что вам надо?
    На тот момент я еще не знал как сделать парные закрывающиеся. Само-собой переделаю.
    Первый тег явно принимает два обязательных параметра, а вы передаёте один. Придумать что-то конкретнее невозможно, потому что вы не хотите показывать сообщение об ошибке.
    Второй параметр не обязательный. В шаблоне этого тэга у меня написано:
    <div class="defaultform" style="width:{{ width }}; 
    {% if height %}height:{{ height }}; {% endif %}">
    <div class="formhead"><h2>{{ caption }}</h2></div>
    Сообщения об ошибке нет. Он просто выводит то, что я ему скажу. Т.е. если я напишу {% beginform "это форма пользователя {{ user }}" "500px" %}, то он это и выведет. Буквально. Без подстановки реального пользователя.
    Интересно, а что делает волшебный параметр takes_context=False?
    Это понятно. Но ведь я же передаю ему все в виде параметра, контекст ему не нужен. Потому что я могу вывести несколько форм: одну для меню, другую для пользователя. И в шапку каждой вовсе не обязательно подставлять что-то из контекста.

    Возможно, это просто ограничение шаблоново джанго. И все это можно сделать другими способами. Но все таки, в чем подвох?
  7. aaleksander

    16.03.2010

    0 ↑
    0 ↓
    Остается только формировать название формы во view.py. Но тогда теряется возможность мультиязычной поддержки на уровне шаблонов. Хотя я до этого еще не дошел, может и нормально все будет :)
  8. {% beginform "это форма пользователя {{ user }}" "500px" %}

    Если Вам нужно ИМЕННО так, то тут как раз надо принимать контекст и рендерить переданную строку шаблоном.

    {% beginform "это форма пользователя ivan" "500px" %}
    

    и

    {% beginform user "500px" %}
    

    будут работать как надо

  9. aaleksander

    16.03.2010

    0 ↑
    0 ↓
    Либо я непонимаю чего-то, либо вы :-)
    Потому что я могу вывести несколько форм
    И в этом случае каждая форма подцепит к себе что-то из контекста?
    Но думаю, я просто где-то в архитектуре попутал. Можно сделать гораздо все проще. Через css например или через js.
  10. Если Вы передадите своему inclusion tag-у строку без шаблонных тэгов (сорри, по-другому не сказать:)), то при рендеринге этой строки как шаблона туда ничего и не подставится. Если контекст передается, это не значит, что его надо обязательно где-то использовать.

  11. Иван Сагалаев

    16.03.2010

    0 ↑
    0 ↓

    Т.е. если я напишу {% beginform "это форма пользователя {{ user }}" "500px" %}, то он это и выведет. Буквально.

    Да, так и должно быть. Потому что это просто строка в кавычках, шаблонная система там ничего не парсит.

    Аркадий уже пару раз писал, что вот это:

    {% beginform user "500px" %}
    

    ... должно работать. Этот вариант устраивает?

  12. aaleksander

    16.03.2010

    0 ↑
    0 ↓
    Понятно. Иными словами, надо всю строку формировать целиком где-нибудь в другом месте.
    Тему можно закрывать.
    Спасибо за терпение :-)
  13. ruguevara

    19.03.2010

    0 ↑
    0 ↓
    Или так:
    {% beginform "это форма пользователя %s" user "500px" %}
  14. aaleksander

    23.03.2010

    0 ↑
    0 ↓
    {% beginform "это форма пользователя %s" user "500px" %}
    Похоже, это оно! Спасибо, буду пробовать.
  15. aaleksander

    24.03.2010

    0 ↑
    0 ↓
    хм. Не работает такая конструкция в шаблонизаторе :(
  16. Иван Сагалаев

    24.03.2010

    0 ↑
    0 ↓

    Александр, пожалуйста, раскрывайте всегда понятие "не работает". Ни у кого ведь нет вашего кода, чтобы в любой момент посмотреть, что он делает :-).

  17. Похоже, ТС решил, что такая конструкция будет работать сама по себе, без дописывания в тэге ее обработки. Подсказываю: не будет.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.