2012-12-23 130 views
0

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

视图

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。这里有什么问题?难道我做错了什么?

在此先感谢。

回答

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> 
+0

您的'content_base.html'中仍有'{endblock%}'标记,请将其删除。 –

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

有时候太多的规范化可没那么好。你可以简单地使用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> 
+0

感谢您的提示,但我将在大量的页面中使用content_base.html,所以我必须这样做;) – mtndesign