Django for循环中的html模板不显示

时间:2017-04-25 15:17:49

标签: python html django

所以我试图获得最新的帖子,我遇到了一个问题,它不会显示帖子

views.py

def latest_post(request):
    latest = Post.objects.all().order_by('-id')[:1]
    context = {'latestPost': latest}
    return render(request, 'latest_post.html', context)

注意:我也尝试过这个,最新= Post.objects.all()

数据库中有条目,我用shell测试

from blog.models import Post
>>> Post.objects.all()
<QuerySet [<Post: test>, <Post: okay so>, <Post: okay-okay>]>

latest_post.html

{% for newest in latestPost %}
<section class="hero is-primary is-medium">
  <div class="hero-body header">
    <div class="container">
     <div class="font">
      <h1 class="title is-1">
        <span id="blog_title">{{ newest.title }}</span>
      </h1>
      <h2 class="subtitle is-3 subup">
        <span id="blog-subtitle">{{ newest.content|truncatechars:20|safe }}</span>
      </h2>
      <h2 class="subtitle is-5 dateup">
        <span id="blogdate">{{ newest.timestamp }}</span><br><br>
        <a href="{{ newest.blog_url }}" class="button is-danger is-large is-inverted">Read More >></a>
      </h2>
    </div>
    </div>
  </div>
</section>
{% endfor %}

在我的blog_index.html中,我有以下内容

{% extends "blog_base.html" %}
{% block blog_main %}
{% load staticfiles %}

{% include 'latest_post.html' %}
<p> other html here </p>
{% endblock %}

Latest_post.html仅在我不使用时使用{%include'state_post.html'%}时显示

{% for newest in latestPost %}
{% endfor %}

所以我确信在某个地方没有任何打字错误阻止latest_post.html显示在我的索引页面中。

my models.py

class Post(models.Model):
    title = models.CharField(max_length=120)
    slug = models.SlugField(unique=True)
    content = models.TextField()
    draft = models.BooleanField(default=False)
    publish = models.DateField(auto_now=False, auto_now_add=False)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self):
       return self.title

    def blog_url(self):
        return reverse("blogposts:blogdetail", kwargs={"slug": self.slug})

附加说明:python3,django 1.11,sqlite。 此外,控制台中不显示任何错误。任何帮助,将不胜感激!谢谢!!

3 个答案:

答案 0 :(得分:1)

看起来您正在将上下文变量直接传递给latest_post.html

return render(request, 'latest_post.html', context)

latestPost中没有这样的上下文变量blog_index.html。 您需要做的是向blog_index.html添加上下文。将其添加到index视图中:

latest = Post.objects.all().order_by('-id')[:1]
context = {'latestPost': latest}
return render(request, 'blog_index.html', context)

此外,您可以使用http://www.bootlint.com/选择查询集中的第一个元素。

答案 1 :(得分:0)

在之前的代码中,您使用[:1]来限制它,因此它只返回一个项目。然后你在一个项目上再次使用forloop。不是最好的做事方式。

  

你是否只想从帖子中获得一个项目?如果是,则不需要Forloop将latest_post.html更改为

<section class="hero is-primary is-medium">
  <div class="hero-body header">
    <div class="container">
     <div class="font">
      <h1 class="title is-1">
        <span id="blog_title">{{ latestPost.title }}</span>
      </h1>
      <h2 class="subtitle is-3 subup">
        <span id="blog-subtitle">{{ latestPost.content|truncatechars:20|safe }}</span>
      </h2>
      <h2 class="subtitle is-5 dateup">
        <span id="blogdate">{{ latestPost.timestamp }}</span><br><br>
        <a href="{{ latestPost.blog_url }}" class="button is-danger is-large is-inverted">Read More >></a>
      </h2>
    </div>
    </div>
  </div>
</section>

您甚至不需要在视图中使用[:1]。有更好的方法来做到这一点

答案 2 :(得分:0)

我也遇到了同样的问题,我该死的确认我犯了任何愚蠢的错误。

不幸的是,我找到了一个。所以, 试试这个:

document.cookie

代替:

context = {'latest': latest}

我希望它有效。