Как это сделать в шаблонах Django - PullRequest
1 голос
/ 22 апреля 2011

Теперь это будет немного странный сценарий использования.Может быть, у кого-то есть идеи.

Справочная информация

Я пишу веб-сайт, который очень интенсивно использует AJAX.На самом деле нет полной перезагрузки страницы.Это подразумевает, что большая часть шаблонной композиции выполняется на стороне клиента.На данный момент я использую несколько написанных мной сценариев в jQuery.Для простоты я использую только переменные заполнители, например: {{ somevar.someattr.someotherattr }}.Вероятно, я мог бы использовать что-то вроде усов, чтобы добиться аналогичного поведения.

С другой стороны, время от времени мне нравится иметь возможность создавать некоторые композиции на стороне сервера.Я ищу способ избежать бессмысленного дублирования кода на стороне клиента и сервера.

Идея

Я хотел бы иметь возможность отображать шаблоны Django втаким образом, что некоторые пробелы в выходе останутся нетронутыми.Более конкретно, если данная переменная не предоставлена ​​в контексте визуализации шаблона, тогда заполнитель должен по-прежнему читать {{ contents }}.Интересно, возможно ли добиться этого или аналогичного поведения с помощью фильтров и / или тегов.

Я мог бы просто написать {{ somevar.someattr|default:"{{ somevar.someattr }}" }}, однако это не очень СУХОЙ.

Ответы [ 4 ]

6 голосов
/ 22 апреля 2011

Вы можете установить TEMPLATE_STRING_IF_INVALID на {{%s}}

http://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATE_STRING_IF_INVALID

1 голос
/ 22 апреля 2011

Я не знаю Django, но стоит обратить внимание на javaScriptMVC: http://javascriptmvc.com/

0 голосов
/ 28 апреля 2011

Это то, что я использую с Django + ICanHaz.js. При этом вы можете использовать фильтр или теги: http://tothinkornottothink.com/post/4282971041/using-jquery-templating-icanhaz-js-with-django

0 голосов
/ 22 апреля 2011

Вот что я в итоге придумал:

Код:

from django import template

register = template.Library()

@register.filter(name='tmpl')
def tmpl_filter(value, arg=None):
    return value or ("{{ %s }}" % arg)

@register.tag(name='tmpl')
def tmpl_tag(parser, token):
    nodelist = parser.parse(('endtmpl',))
    parser.delete_first_token()
    return UpperNode(nodelist)

class UpperNode(template.Node):
    def __init__(self, nodelist):
        super(UpperNode, self).__init__()
        self.nodelist = nodelist
        nodes = self.get_nodes_by_type(template.VariableNode)
        for n in nodes:
            v = n.filter_expression.var
            if v.lookups:
                for i, f in enumerate(n.filter_expression.filters):
                    print f
                    if f[0] == tmpl_filter and len(f[1]) == 0:
                        n.filter_expression.filters[i] = \
                            (f[0], [(False, '.'.join(v.lookups))],)

    def render(self, context):
        return self.nodelist.render(context)

Использование:

{% load placeholders %}
{% tmpl %}
    {{ var.for.template|tmpl }}
    {{ regular.var }}
    {% nestedtag %}
        {{ another.var.for.template|tmpl }}
    {% endnestedtag %}
{% endtmpl %}

Это взлом, но не такой большой, чтобы вызвать реальные проблемы. Кроме того, я думаю, что это потокобезопасно, однако не проверял его в этом отношении.

...