我一直在尝试构建我的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 时?总而言之,我知道我的问题相当简单,我没有正确编程。我的博客是否有问题&#39;文件?我的观点&#39;我的BlogIndex课程怎么样?文件?我一直怀疑我的BlogIndex函数编码错误,但如果可以,那么可能是我的博客&#39;模板不对;也许是两者。在这一点上,任何形式的帮助都是我的进步。谢谢。
答案 0 :(得分:2)
方法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
块来简化模板。
答案 1 :(得分:2)
您收到错误get_queryset() missing 1 required positional argument: 'request'
,因为您已在request
方法中将get_queryset()
定义为参数,但在实际的Django代码中get_queryset()
,request
是不是它的论据。只需从request
中删除get_queryset()
作为参数,它就可以正常运行。
此外,您需要在queryset
方法中返回get_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')
答案 2 :(得分:1)
编辑: render的语法是
render(request, template_name, context)
您尚未在渲染语句中提及请求。 尝试:
return render(request, template_name,{'posts': posts})