在使用django之后,我发现似乎有两种方法可以将数据传递到html页面。例如,如果我有一个名为Products的模型,我可以
views.py
context = {
'products' : Products.objects.all()
}
return render(request, 'products/product_page.html', context)product_page.html
{% for post in posts %}
//do stuff with {{post}}
{% endfor %}或者我可以这样做
product_tags.py
register = template.Library()
@register.simple_tag
def get_Products():
return Products.objects.all()product_page.html
{% load product_tags %}
{% get_Products as elections %}
//do stuff with {{elections}}一种方式比另一种方式更好吗?
发布于 2020-01-11 10:19:30
可能的重复项:
在你的例子中,如果你只使用一次,我猜它的性能是一样的。
但是在某些情况下,如果你不得不"get_Products“两次,这是对数据库访问的浪费。
上下文对我来说是一种常见的方式。只有当我需要得到一些非常具体的东西时,才写模板标签,比如在for循环上有3个不同模型的查询。
看看我的例子:
@register.simple_tag
def get_skipper_in_training_finish_datetime(training, user):
skipper = training.get_skipper_in_training(user)
if skipper:
return skipper.finish_datetime我在活动查询中有3个不同的模型,其中只有一个有"finish_datetime“。
使用包含此应用程序的所有模板标签的视图
{% load utils %}
{% regroup activities by start_date|date:'d-m-Y' as activities_by_date %}
{% for start_date in activities_by_date %}
{% for activity in start_date.list %}
...
{% if "Training" in activity.model_name %}
<script>
{% get_skipper_in_training_finish_datetime activity user as skipper_finish %}
document.write($.format.toBrowserTimeZone("{{ skipper_finish |date:'c' }}", "HH:mm:ss"))
</script>
{% elif activity.end_date %}
<script>document.write($.format.toBrowserTimeZone("{{ activity.end_date|date:'c' }}", "dd-MM-yyyy"))</script>
{% else %}
-
{% endif %}
...
{% endfor %}
...
{% endfor %}Django Docs在谈论模板标记时并不是指性能
Custom template tags and filters
但正如你所看到的,这是一个逻辑和复杂的模型使用问题。
希望我能帮上忙
https://stackoverflow.com/questions/59690210
复制相似问题