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也有同样的问题,但答案没有多大帮助。这很难理解,而且链接不起作用。对于无法理解此答案的用户,请查看创建上下文变量。