在Django中重用其他视图中的视图

时间:2014-06-20 17:24:10

标签: django

我的网站上有一些组件出现在很多页面上。请记住,我想将它们分解为单独的片段,我可以将其包含在需要它们的视图中。

如果它只是静态项目,那么{% 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" %}

请注意,将会有更多使用view1view2的观看次数(例如所有文章的投票概览);这就是我将它们分解为不同功能的原因。

我该如何使这项工作? 或者Django工具箱中是否有更好的技巧可以在不重复view1和view2的情况下每次我想在其他视图中使用相同的片段时使用它?

2 个答案:

答案 0 :(得分:0)

django中间件怎么样,你可以在这种情况下使用中间件。 view1和view2每次都重复吗?然后将render1和render2附加到您的请求中。

中间件是Django请求/响应处理的钩子框架。它是一个轻量级的低级“插件”系统,用于全局改变Django的输入或输出。

https://docs.djangoproject.com/en/dev/topics/http/middleware/

答案 1 :(得分:0)

这就是自定义模板标记 - 特别是inclusion tags - 用于:使用自己的上下文呈现模板片段。