Django 1.8:无法在我的网站上显示我的博客条目列表

Posted

技术标签:

【中文标题】Django 1.8:无法在我的网站上显示我的博客条目列表【英文标题】:Django 1.8: cannot present a List of my blog entries on my site 【发布时间】:2015-09-26 17:33:13 【问题描述】:

我一直在尝试构建我的 Django 博客页面,以某种方式查询我以反时间顺序发布的帖子。到目前为止,我发布了三个测试帖子(标记为“测试条目”1-3),但在尝试在查询列表中显示帖子后,我遇到了模板错误(已解决),然后在它的地方是类型错误(已解决),现在我有一个同样乏味的问题:空白网页。现在我根本无法在实际网页上发布我的帖子。

这是我得到的:

models.py

from django.db import models
from django.db.models import permalink
from django_markdown.models import MarkdownField

# Create your models here.

class EntryQuerySet(models.QuerySet):
    # This will be used for filtering everything that is published
    def published(self):
        return self.filter(publish=True)

class Post(models.Model):
    title = models.CharField(max_length=200) 
    body = MarkdownField() # formerly Text Field
    slug = models.SlugField(max_length=200, unique=True)
    publish = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True) # Keeps track of everytime it gets saved
   # author = models.ForeignKey(User)
    # tags = models.ManyToManyField(Tag) # 16 min vid

    objects = EntryQuerySet.as_manager() #Im allowed to do this because of the QuerySet class

    def __str__(self): 
        return self.title

    @permalink
    def get_absolute_url(self):
        return ('view_blog_post', None,  'slug': self.slug )

    class Meta:
        verbose_name = "Blog Entry"
        verbose_name_plural = "Blog Entries"
        ordering = ["-created",]

views.py:

from django.shortcuts import render 
from . import models # so I can import 'Post'
from django.views.generic.list import ListView 
from django.utils import timezone

class BlogIndex(ListView): 
    model = models.Post
    def get_queryset(self, request):
        template_name = "blog.html"
        posts = models.Post.objects.filter(publish=timezone.now()).order_by('publish')
        return render(request,template_name,'posts': posts)

base.html

<!DOCTYPE html>
<html lang="en">
  <head>
    % include 'header.html' %
  </head>

  <body>
  <!-- Navbar -->
    % include 'navbar.html' %

  <!-- Jumbotron -->
   % block jumbotron_content %

   % endblock %

  <!-- Container -->
    <div class="container">

      % block content %
      % endblock %

      % block blog_entries %
      % endblock %
   </div>


  <!-- FOOTER -->
      <footer>
        <p>&copy; Company 2014</p>
      </footer>
    </div> <!-- /container -->
    <!-- Bootstrap core javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://getbootstrap.com/dist/js/bootstrap.min.js"></script>
    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="http://getbootstrap.com/assets/js/ie10-viewport-bug-workaround.js"></script>
  </body>
</html>

blog.html

% extends "base.html" %
% load django_markdown %

% block blog_entries %
<div id="block">
<div class="prose"> 
<h1>Articles</h1>
    % if posts %
        <ul>
            % for post in posts %
                <li>
                <a href=" post.get_absolute_url "> 
                 post.title 
                </a> 
                </li>
            % endfor %
        </ul>
    % else %
        <p>There are no posts...but there should BE!</p>
    % endif %
</div>
</div>
% endblock %

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from blog.views import BlogIndex

url1 = url(r'^admin/', include(admin.site.urls))           # 1. url for "admin" page
url2 = url(r'^$', 'joins.views.home', name='home')         # 2. url for "home" page
url3 = url(r'^blogI/$', BlogIndex.as_view(), name="index") # 3. url for the "blog" page
url4 = url(r'^markdown/', include('django_markdown.urls')) # 4. url for the "django_markdown" module

urlpatterns = [url1, url2 , url3 ,url4]

这是我的一般工作环境

Request Method: GET
Request URL: http://127.0.0.1:8000/blogI/

Django Version: 1.8
Python Version: 3.4.3
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'joins',
 'blog',
 'django_markdown')

有没有人真正遇到过这个问题,尤其是在使用 Python 3.4 和 Django 1.8 时?就我所知,我的问题相当简单,而且我没有正确编程。我的“blog.html”文件有问题吗?我的“视图”文件中的 BlogIndex 类呢?我一直怀疑我的 BlogIndex 函数编码错误,但如果没问题,那可能是我的“博客”模板不对;也许两者兼而有之。在这一点上,任何形式的帮助对我来说都是进步。谢谢。

【问题讨论】:

【参考方案1】:

get_queryset 方法应该简单地返回一个查询集,你不应该在那里渲染一个模板,或者返回一个字典。

试试下面的方法。

class BlogIndex(ListView): 
    model = models.Post
    template_name = "blog.html"
        def get_queryset(self):
            return models.Post.objects.filter(publish=timezone.now()).order_by('publish')

在您的模板中,遍历 post_list 而不是 posts

% for post in posts %

最后,您可以通过覆盖 blog.html 中的内容块,然后从基本模板中删除 blog_entries 块来简化模板。

【讨论】:

感谢您的解决方案。这与我最初的解决方案相似,只是现在让我一片空白,仍然没有可用的帖子查询列表,所以我不知道从那里去哪里。 顺便说一句:我最终编辑了这个问题,因为根据您和 Ajay Gupta 分享的内容,我认为我找到了从第一个问题中合理退出的方法,但现在我仍然无法弄清楚如何让我的帖子列在我的博客页面上。你有什么线索吗?我一直怀疑我的 BlogIndex 函数编码错误,但如果没问题,那么它可能是我的“博客”模板。 请编辑您的问题并显示您的基本模板。我的猜测是它没有块% block blog_entries % 我添加了它,但我认为该块有效,因为标题“文章”出现了,但没有别的。【参考方案2】:

您收到错误 get_queryset() missing 1 required positional argument: 'request' 是因为您已在 get_queryset() 方法中将 request 定义为参数,但在实际 Django 代码的 get_queryset() 中,request 不是它的参数。只需从get_queryset() 中删除request 作为参数,它应该可以工作。

此外,您需要在get_queryset() 方法中返回queryset,而不是在那里进行所有的渲染和处理。 get_queryset 的目的是只返回一个queryset

最终代码应该是:

from django.shortcuts import render 
from . import models # so I can import 'Post'
from django.views.generic.list import ListView 
from django.utils import timezone

class BlogIndex(ListView): 

    model = models.Post
    template_name = "blog.html"

    def get_queryset(self):
        return models.Post.objects.filter(publish=timezone.now()).order_by('publish')

【讨论】:

【参考方案3】:

编辑: render 的语法是

render(request, template_name, context)

您没有在渲染语句中提到请求。 试试:

return render(request, template_name,'posts': posts)

【讨论】:

我什至不认为这是一个选择。很有创意,但我试过了,还是没有改变。很奇怪。 好的,有一些进展,但仍然存在问题(但确实有进展)。我将渲染添加到我的“get_queryset()”作为输入并将其放在我的输出中,但现在错误是:get_queryset() 缺少 1 个必需的位置参数:'request'...做什么这甚至意味着什么?我不记得在这些情况下必须对“请求”做更多的事情 让我们看看还有什么问题 它现在不见了。目前我的问题是 TypeError at /blogI/ 让我们清除上面的所有内容并粘贴新的回溯

以上是关于Django 1.8:无法在我的网站上显示我的博客条目列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Gatsby 博客网站中有效地显示 GIF 图像?

如何在我的博客网站顶部显示最新帖子和评论?

Django 1.8 迁移无法将列 ID 转换为整数

Django 管理员不会显示字段

Chartjs 没有在我的 Django 项目中显示图表

Django:重新启动后出现“没有名为 context_processors 的模块”错误