Можете ли вы сделать собственный тег шаблона, который возвращает набор запросов? Если да, то как? - Джанго - PullRequest
8 голосов
/ 31 октября 2011

Давайте сделаем это очень легко для моих поддерживающих SOians (?).

Так обычно работают пользовательские теги шаблонов -

Шаблон ->

{% block content %}

     blah blah blah

     {% custom_tag_load %}

{% endblock %}

Вызывается custom_tag_load, и он возвращает строку.То, что я хочу вернуть, это набор запросов, который я мог бы использовать следующим образом ->

{% block content %}

     blah blah blah

     {% for x in custom_tag_load %}

          {{ x.datetime }}

     {% endfor %}

{% endblock %}

Примечание -> То, что я в основном пытаюсь сделать, это избежать передачи набора запросов через представление, и я 'я не уверен, что мне удобно хранить наборы запросов в моем глобальном контексте.

Ответы [ 2 ]

6 голосов
/ 31 октября 2011

Вы можете вернуть все что угодно из тега, включая набор запросов.Однако вы не можете использовать тег внутри тега for - вы можете использовать только переменную там (или переменную, пропущенную через фильтр).То, что вы могли бы сделать, это заставить ваш тег поместить набор запросов в переменную в контексте и использовать эту переменную в цикле for.См. Документацию по о том, как установить переменную из тега - хотя обратите внимание, что в версии для разработки есть более простой метод для этого.

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

4 голосов
/ 31 октября 2011

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

#my_tags.py
from django import template
from my_app.models import MyModel

register = template.Library()

@register.inclusion_tag('my_template.html')
def my_custom_tag():
    things = MyModel.objects.all()
    return {'things' : things}


#my_template.html
{% if things %}
    <ul>
    {% for thing in things %}
        <li>{{ thing }}</li>    
    {% empty %}
        <li>Sorry, no things yet.</li>
    {% endfor %}
    </ul>
{% endif %}


#the_view.html
{% load my_tags %}

{% my_custom_tag %}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...