Django模板包含一个带有来自视图的变量的模板

时间:2012-12-23 21:41:49

标签: django

我有Django模板的问题。我想创建一个基本html,我将用它来显示帖子。我从视图中调用了一个模板,其中包含一个html文件,该文件扩展了基本的html。

  

查看

def main(request):
    all_posts = News.objects.all()
    return render_to_response("index.html", {'all_posts': all_posts})
     

模板 - index.html

<div id="content">
    {% include 'content.html' with posts=all_posts%}
</div>
  

content.html

{% extends "content_base.html" %}

{% for post in posts %}
    {% block date_of_post %} {{ post.date }} {% endblock %}
    {% block post_author %} {{ post.author }} {% endblock %}
    {% block post %} {{ post.content }} {% endblock %}
{% endfor %}
  

content_base.html

<div class="post">
    <h2 class="title"><a href="#">{% block blabla %}{% endblock %}</a></h2>
    <p class="meta"><span class="date">{% block date_of_post %}{% endblock %}</span><span class="posted">Posted by <a href="#">{% block post_author %}{% endblock %}</a></span></p>
    <div style="clear: both;">&nbsp;</div>
    <div class="entry">
        <p>
            {% block post %} {% endblock %}
        </p>    
        <p class="links">
            <a href="#" class="more">Read More</a>
            <a href="#" title="b0x" class="comments">Comments</a>
        </p>
    </div>
</div>

但似乎我无法将* all_posts *变量传递给 content.html 。这里有什么问题?难道我做错了什么?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您正在使用名称相同的块,因为您在循环中使用它们:

{% for post in posts %}
    {% block date_of_post %} {{ post.date }} {% endblock %}
    {% block post_author %} {{ post.author }} {% endblock %}
    {% block post %} {{ post.content }} {% endblock %}
{% endfor %}

你做不到。看here

答案 1 :(得分:2)

您应该将循环移至index.html,并直接包含content_base.html。所以index.html变成:

<div id="content">
    {% for post in posts %}
        {% include 'content_base.html' %}
    {% endfor %}
</div>

和content_base.html是

<div class="post">
    <h2 class="title"><a href="#">{{ post.title }}</a></h2>
    <p class="meta"><span class="date">{{ post.date }}</span><span class="posted">Posted by <a href="#">{{{ post.author }}</a></span></p>
    <div style="clear: both;">&nbsp;</div>
    <div class="entry">
        <p>
            {{ post.content }}
        </p>    
        <p class="links">
            <a href="#" class="more">Read More</a>
            <a href="#" title="b0x" class="comments">Comments</a>
        </p>
    </div>
</div>

答案 2 :(得分:1)

有时过多的标准化并不是那么好。您可以简单地使用index.html并且所有代码都可以到那里(避免不必要的块)。

<div id="content">
    {% for post in all_posts %}
        <div class="post">
            <h2 class="title"><a href="#">{{post.title}}</a></h2>
            <p class="meta"><span class="date">{{post.date}}</span><span class="posted">Posted by <a href="#">{{post.post_author}}</a></span></p>
            <div style="clear: both;">&nbsp;</div>
            <div class="entry">
                <p>
                    {{post.content}}
                </p>    
                <p class="links">
                    <a href="#" class="more">Read More</a>
                    <a href="#" title="b0x" class="comments">Comments</a>
                </p>
            </div>
        </div>
    {% endfor %}
</div>