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>© 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:无法在我的网站上显示我的博客条目列表的主要内容,如果未能解决你的问题,请参考以下文章