Django 您可以创建一个返回查询集的自定义模板标记吗?如果是,如何德扬戈

Django 您可以创建一个返回查询集的自定义模板标记吗?如果是,如何德扬戈,django,django-templates,Django,Django Templates,让我们让这对我的同胞们来说很容易(?) 这就是自定义模板标记的正常工作方式- 模板-> {% block content %} blah blah blah {% custom_tag_load %} {% endblock %} 调用自定义标记加载并返回字符串。我想要返回的是一个查询集,我可能会这样使用-> {% block content %} blah blah blah {% for x in custom_tag_load %}

让我们让这对我的同胞们来说很容易(?)

这就是自定义模板标记的正常工作方式-

模板->

{% block content %}

     blah blah blah

     {% custom_tag_load %}

{% endblock %}
调用自定义标记加载并返回字符串。我想要返回的是一个查询集,我可能会这样使用->

{% block content %}

     blah blah blah

     {% for x in custom_tag_load %}

          {{ x.datetime }}

     {% endfor %}

{% endblock %}

注意->我基本上是想避免在视图中传递查询集,我不确定在全局上下文中存储查询集是否合适。

模板标记可以做任何你想做的事情。从伪代码中,您可以使用包含标记完成所需的操作:

#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 %}
#my_tags.py
从django导入模板
从my_app.models导入MyModel
register=template.Library()
@register.inclusion_标记('my_template.html'))
定义我的自定义标签()
things=MyModel.objects.all()
返回{'things':things}
#my_template.html
{%if%things}
    {%表示事物中的事物%}
  • {{thing}}
  • {%empty%}
  • 对不起,还没有
  • {%endfor%}
{%endif%} #_view.html {%load my_tags%} {%my_custom_tag%}

或者,您可以编写一个自定义标记,将查询集添加到上下文中。希望这对您有所帮助。

您可以从标记返回任何您喜欢的内容,包括查询集。但是,不能在
for
标记中使用标记-只能在那里使用变量(或通过过滤器传递的变量)。您可以做的是让标记将queryset放入上下文中的变量中,并在for循环中使用该变量。请参阅上的文档-不过请注意,开发版本不适合这样做


但是,您也不应该担心将查询集放入上下文处理器中。不要忘记queryset是惰性的,因此除非在模板中计算或迭代queryset,否则不会对数据库进行命中。

这有点挫败了MVC的整个观点。这是一个有趣的问题,但一般来说,视图层永远不应该直接从数据库中获取数据。不过,对于一个有趣的问题,@Chris,那真的不是真的。你不想从模板中的db中获取核心对象,但是辅助的东西——比如最近文章的边栏——在模板标签中是非常有意义的。嘿,布兰登,这正是我想要避免的事情,我不希望“my_template.html”在“the_view.html”之外。谢谢你的回复。啊,这很有道理。为什么好东西总是在开发版本中??FMLI也有同样的问题,但答案没有多大帮助。这很难理解,而且链接不起作用。对于无法理解此答案的用户,请查看创建上下文变量。