我的网站上有一些组件出现在很多页面上。请记住,我想将它们分解为单独的片段,我可以将其包含在需要它们的视图中。
如果它只是静态项目,那么{% include "snippet.html" %}
将是完美的解决方案。如何为包含表单(以及视图中的逻辑)或需要在显示之前进行计算的片段实现类似的操作?此外,我希望能够将这些片段嵌套几层。
我知道我可以使用{% if ... %} ... {% endif %}
块在模板中放入简单的逻辑,但这很快会变成可怕的spagetthi,我希望将业务逻辑与表示逻辑分开。
我想象一个模式如下(这里有过度简化的业务逻辑):
def view1(request):
"Display some data"
total = get_total_vote_count()
return render(request, 'snippet1.html', {'total': total})
def view2(request, pk):
"Display some data about the article with primary key pk."
votes = get_votes_for_article(pk)
render1 = view1(request)
return render(request, 'snippet2.html', {'votes': votes, 'render1': render1})
def view3(request, pk):
"Display article pk and some additional data from view1 and view2":
article = get_object_or_404(Article, pk=pk)
render2 = view2(request, pk)
return render(request,
'article.html',
{'article': article, 'render2': render2},
)
使用类似的模板:
# in snippet1.html:
<a href="overview.html">{{ total }}</a>
# in snippet2.html:
<p>Votes for this article: {{ votes }} out of {{ render1 }} total votes.</p>
# in page.html:
{% extends "base.html" %}
{% block "content" %}
<h1>article.title</h1>
<p>article.text</p>
<small>{{ render2 }}</small>
{% end block "content" %}
请注意,将会有更多使用view1
和view2
的观看次数(例如所有文章的投票概览);这就是我将它们分解为不同功能的原因。
我该如何使这项工作? 或者Django工具箱中是否有更好的技巧可以在不重复view1和view2的情况下每次我想在其他视图中使用相同的片段时使用它?
答案 0 :(得分:0)
django中间件怎么样,你可以在这种情况下使用中间件。 view1和view2每次都重复吗?然后将render1和render2附加到您的请求中。
中间件是Django请求/响应处理的钩子框架。它是一个轻量级的低级“插件”系统,用于全局改变Django的输入或输出。
https://docs.djangoproject.com/en/dev/topics/http/middleware/
答案 1 :(得分:0)
这就是自定义模板标记 - 特别是inclusion tags - 用于:使用自己的上下文呈现模板片段。