在此之前我们已经编写了 Blog 的首页视图,并且配置了 URL 和模板,让 Django 能够正确地处理 HTTP 请求并返回合适的 HTTP 响应。不过我们仅仅在首页返回了一句话:欢迎访问我的博客。这是个 Hello World 级别的视图函数,我们需要编写真正的首页视图函数,当用户访问我们的博客首页时,他将看到我们发表的博客文章列表,就像 演示项目 里展示的这样。
首页视图函数
上一节我们阐明了 Django 的开发流程。即首先配置 URL,把 URL 和相应的视图函数绑定,一般写在 urls.py 文件里,然后在工程的 urls.py 文件引入。其次是编写视图函数,视图中需要渲染模板,我们也在 settings.py 中进行了模板相关的配置,让 Django 能够找到需要渲染的模板。最后把渲染完成的 HTTP 响应返回就可以了。相关的配置和准备工作都在之前完成了,这里我们只需专心编写视图函数,让它实现我们想要的功能即可。
首页的视图函数其实很简单,代码像这样:
blog/views.py
from django.shortcuts import render
from .models import Post
def index(request):
post_list = Post.objects.all().order_by('-created_time')
return render(request, 'blog/index.html', context={'post_list': post_list})
我们曾经在前面的章节讲解过模型管理器 objects
的使用。这里我们使用 all()
方法从数据库里获取了全部的文章,存在了 post_list
变量里。all
方法返回的是一个 QuerySet
(可以理解成一个类似于列表的数据结构),由于通常来说博客文章列表是按文章发表时间倒序排列的,即最新的文章排在最前面,所以我们紧接着调用了 order_by
方法对这个返回的 queryset 进行排序。排序依据的字段是 created_time
,即文章的创建时间。-
号表示逆序,如果不加 -
则是正序。 接着如之前所做,我们渲染了 blog\index.html 模板文件,并且把包含文章列表数据的 post_list
变量传给了模板。
处理静态文件
我们的项目使用了从网上下载的一套博客模板(点击这里下载全套模板)。这里面除了 HTML 文档外,还包含了一些 CSS 文件和 JavaScript 文件以让网页呈现出我们现在看到的样式。同样我们需要对 Django 做一些必要的配置,才能让 Django 知道如何在开发服务器中引入这些 CSS 和 JavaScript 文件,这样才能让博客页面的 CSS 样式生效。
按照惯例,我们把 CSS 和 JavaScript 文件放在 blog 应用的 static 目录下。因此,先在 blog 应用下建立一个 static 文件夹。同时,为了避免和其它应用中的 CSS 和 JavaScript 文件命名冲突(别的应用下也可能有和 blog 应用下同名的 CSS 、JavaScript 文件),我们再在 static 目录下建立一个 blog 文件夹,把下载的博客模板中的 css 和 js 文件夹连同里面的全部文件一同拷贝进这个目录。最终我们的 blog 应用目录结构应该是这样的:
blog\
__init__.py
static\
blog\
css\
.css 文件...
js\
.js 文件...
admin.py
apps.py
migrations\
__init__.py
models.py
tests.py
views.py
用下载的博客模板中的 index.html 文件替换掉之前我们自己写的 index.html 文件。如果你好奇,现在就可以运行开发服务器,看看首页是什么样子。
如图所示,你会看到首页显示的样式非常混乱,原因是浏览器无法正确加载 CSS 等样式文件。需要以 Django 的方式来正确地处理 CSS 和 JavaScript 等静态文件的加载路径。CSS 样式文件通常在 HTML 文档的 head 标签里引入,打开 index.html 文件,在文件的开始处找到 head 标签包裹的内容,大概像这样:
templates/blog/index.html
<!DOCTYPE html>
<html>
<head>
<title>Black & White</title>
<!-- meta -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- css -->
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<link rel="stylesheet" href="css/pace.css">
<link rel="stylesheet" href="css/custom.css">
<!-- js -->
<script src="js/jquery-2.1.3.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/pace.min.js"></script>
<script src="js/modernizr.custom.js"></script>
</head>
<body>
<!-- 其它内容 -->
<script src="js/script.js"></script>
</body>
</html>
CSS 样式文件的路径在 link 标签的 href 属性里,而 JavaScript 文件的路径在 script 标签的 src 属性里。可以看到诸如 `href="css/bootstrap.min.css" 或者 src="js/jquery-2.1.3.min.js" 这样的引用,由于引用文件的路径不对,所以浏览器引入这些文件失败。我们需要把它们改成正确的路径。把代码改成下面样子,正确地引入 static 文件下的 CSS 和 JavaScript 文件:
templates/blog/index.html
+ {% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
<title>Black & White</title>
<!-- meta -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- css -->
- <link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
- <link rel="stylesheet" href="css/pace.css">
- <link rel="stylesheet" href="css/custom.css">
+ <link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">
+ <link rel="stylesheet" href="{% static 'blog/css/pace.css' %}">
+ <link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">
<!-- js -->
- <script src="js/jquery-2.1.3.min.js"></script>
- <script src="js/bootstrap.min.js"></script>
- <script src="js/pace.min.js"></script>
- <script src="js/modernizr.custom.js"></script>
+ <script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
+ <script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
+ <script src="{% static 'blog/js/pace.min.js' %}"></script>
+ <script src="{% static 'blog/js/modernizr.custom.js' %}"></script>
</head>
<body>
<!-- 其它内容 -->
- <script src="js/script.js' %}"></script>
+ <script src="{% static 'blog/js/script.js' %}"></script>
</body>
</html>
这里 - 表示删掉这一行,而 + 表示增加这一行。
我们把引用路径放在了一个奇怪的符号里,例如:href="{% static 'blog/css/bootstrap.min.css' %}"。用 {% %} 包裹起来的叫做模板标签。我们前面说过用 {{ }} 包裹起来的叫做模板变量,其作用是在最终渲染的模板里显示由视图函数传过来的变量值。而这里我们使用的模板标签的功能则类似于函数,例如这里的 static
模板标签,它把跟在后面的字符串 'css/bootstrap.min.css'
转换成正确的文件引入路径。这样 css 和 js 文件才能被正确加载,样式才能正常显示。
为了能在模板中使用 {% static %} 模板标签,别忘了在最顶部 {% load staticfiles %} 。static 模板标签位于 staticfiles 模块中,只有通过 load 模板标签将该模块引入后,才能在模板中使用 {% static %} 标签。
替换完成后你可以刷新页面并看看网页的源代码,看一看 {% static %} 模板标签在页面渲染后究竟被替换成了什么样的值。例如我们可以看到
<link rel="stylesheet" href="{% static 'blog/css/pace.css' %}">
这一部分最终在浏览器中显示的是:
<link rel="stylesheet" href="/static/blog/css/pace.css">
这正是 pace.css 文件所在的路径,其它的文件路径也被类似替换。可以看到 {% static %} 标签的作用实际就是把后面的字符串加了一个 /static/ 前缀,比如 {% static 'blog/css/pace.css' %}
最终渲染的值是 /static/blog/css/pace.css
。而 /static/ 前缀是我们在 settings.py 文件中通过 STATIC_URL = '/static/'
指定的。事实上,如果我们直接把引用路径写成 /static/blog/css/pace.css
也是可以的,那么为什么要使用 {% static %} 标签呢?想一下,目前 URL 的前缀是 /static/,如果哪一天因为某些原因,我们需要把 /static/ 改成 /resource/,如果你是直接写的引用路劲而没有使用 static 模板标签,那么你可能需要改 N 个地方。如果你使用了 static 模板标签,那么只要在 settings.py 处改一个地方就可以了,即把 STATIC_URL = '/static/'
改成 STATIC_URL = '/resource/'
。
有时候按 F5 刷新后页面还是很乱,这可能是因为浏览器缓存了之前的结果。按 Shift + F5(有些浏览器可能是 Ctrl + F5)强制刷新浏览器页面即可。
注意这里有一个 CSS 文件的引入
<link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
我们没有使用模板标签,因为这里的引用的文件是一个外部文件,不是我们项目里 static\blog\css 目录下的文件,因此无需使用模板标签。
正确引入了静态文件后样式显示正常了。
修改模板
目前我们看到的只是模板中预先填充的一些数据,我们得让它显示从数据库中获取的文章数据。下面来稍微改造一下模板:
在模板 index.html 中你会找到一系列 article 标签:
templates/blog/index.html
...
<article class="post post-1">
...
</article>
<article class="post post-2">
...
</article>
<article class="post post-3">
...
</article>
...
这里面包裹的内容显示的就是文章数据了。我们前面在视图函数 index 里给模板传了一个 post_list
变量,它里面包含着从数据库中取出的文章列表数据。就像 Python 一样,我们可以在模板中循环这个列表,把文章一篇篇循环出来,然后一篇篇显示文章的数据。要在模板中使用循环,需要使用到前面提到的模板标签,这次使用 {% for %} 模板标签。将 index.html 中多余的 article 标签删掉,只留下一个 article 标签,然后写上下列代码:
templates/blog/index.html
...
{% for post in post_list %}
<article class="post post-{{ post.pk }}">
...
</article>
{% empty %}
<div class="no-post">暂时还没有发布的文章!</div>
{% endfor %}
...
可以看到语法和 Python 的 for 循环类似,只是被 {% %} 这样一个模板标签符号包裹着。{% empty %} 的作用是当 post_list
为空,即数据库里没有文章时显示 {% empty %} 下面的内容,最后我们用 {% endfor %} 告诉 Django 循环在这里结束了。
你可能不太理解模板中的 post
和 post_list
是什么。post_list
是一个 QuerySet
(类似于一个列表的数据结构),其中每一项都是之前定义在 blog\models.py 中的 Post 类的实例,且每个实例分别对应着数据库中每篇文章的记录。因此我们循环遍历 post_list
,每一次遍历的结果都保存在 post
变量里。所以我们使用模板变量来显示 post
的属性值。例如这里的 {{ post.pk }}
(pk 是 primary key 的缩写,即 post 对应于数据库中记录的 id 值,该属性尽管我们没有显示定义,但是 Django 会自动为我们添加)。
现在我们可以在循环体内通过 post
变量访问单篇文章的数据了。分析 article 标签里面的 HTML 内容,h1 显示的是文章的标题,
<h1 class="entry-title">
<a href="single.html">Adaptive Vs. Responsive Layouts And Optimal Text Readability</a>
</h1>
我们把标题替换成 post
的 title
属性值。注意要把它包裹在模板变量里,因为它最终要被替换成实际的 title 值。
<h1 class="entry-title">
<a href="single.html">{{ post.title }}</a>
</h1>
下面这 5 个 span 标签里分别显示了分类(category)、文章发布时间、文章作者、评论数、阅读量。
<div class="entry-meta">
<span class="post-category"><a href="#">Django 博客教程</a></span>
<span class="post-date"><a href="#"><time class="entry-date"
datetime="2012-11-09T23:15:57+00:00">2017年5月11日</time></a></span>
<span class="post-author"><a href="#">追梦人物</a></span>
<span class="comments-link"><a href="#">4 评论</a></span>
<span class="views-count"><a href="#">588 阅读</a></span>
</div>
再次替换掉一些数据,由于评论数和阅读量暂时没法替换,因此先留着,我们在之后实现了这些功能后再来修改它,目前只替换分类、文章发布时间、文章作者:
<div class="entry-meta">
<span class="post-category"><a href="#">{{ post.category.name }}</a></span>
<span class="post-date"><a href="#"><time class="entry-date"
datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span>
<span class="post-author"><a href="#">{{ post.author }}</a></span>
<span class="comments-link"><a href="#">4 评论</a></span>
<span class="views-count"><a href="#">588 阅读</a></span>
</div>
这里 p 标签里显示的是摘要
<div class="entry-content clearfix">
<p>免费、中文、零基础,完整的项目,基于最新版 Django 1.10 和 Python 3.5。带你从零开始一步步开发属于自己的博客网站,帮助你以最快的速度掌握 Django
开发的技巧...</p>
<div class="read-more cl-effect-14">
<a href="#" class="more-link">继续阅读 <span class="meta-nav">→</span></a>
</div>
</div>
替换成 post
的摘要:
<div class="entry-content clearfix">
<p>{{ post.excerpt }}</p>
<div class="read-more cl-effect-14">
<a href="#" class="more-link">继续阅读 <span class="meta-nav">→</span></a>
</div>
</div>
再次访问首页,它显示:暂时还没有发布的文章!好吧,做了这么多工作,但是数据库中其实还没有任何数据呀!接下来我们就实际写几篇文章保存到数据库里,看看显示的效果究竟如何。
总结
本章节的代码位于:Step6: real blog index view。
如果遇到问题,请通过下面的方式寻求帮助。
- 在下方评论区留言。
- 将问题的详细描述通过邮件发送到 djangostudyteam@163.com,一般会在 24 小时内回复。
- 在 Pythonzhcn 社区的新手问答版块 发布帖子。
-- EOF --
看博主文章第 N 天, 痛哭流涕中···
友情提示:这一部放好css再怎么刷新样式都不出来,重新启动下server就好了
走到这里的时候数据库里面不是存着那条test的文章吗,为什么是空呢
博主,我想问一下为什么一定要新建个static目录,然后把模板放进去呢?我把模板拷贝到templates/blog/下面,难道不是一样的吗?
另外相信很多人看到这里关于这个静态模板标签不是很理解,Django2.0的中文官方文档可供查阅https://docs.djangoproject.com/zh-hans/2.0/intro/tutorial06/
友情提示下和我一样HTML语言不怎么懂的同学。
语句中<link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">的static两边必须是带空格的,才会被当做是模板标签来处理。
赞
在{% for post in post_list %}这一步中出现了django.db.utils.OperationalError: no such column: blog_post.title错误,不知道怎么解决
运行一下 python manage.py makemigrations 和 migrate 命令试一下呢
按照博主的步骤一步步来的,不知道为什么“处理静态文件”那一节我的网页打开总是混乱的,各种细节都检查了,没有问题,但是页面就是混乱。win7系统,Python3.6.6,Django版本用的跟博主一样,好气啊!重新做了一遍还是那样。
浏览器调试看一下引入静态资源是否404?如果不是的话清除一浏览器缓存试试。
感谢博主的回复。我试着调试之后显示
Failed to load resource: net::ERR_FILE_NOT_FOUND /E:/static/blog/css/bootstrap.min.css
Failed to load resource: net::ERR_FILE_NOT_FOUND /E:/static/blog/css/pace.css
Failed to load resource: net::ERR_FILE_NOT_FOUND /E:/static/blog/css/custom.css
Failed to load resource: net::ERR_FILE_NOT_FOUND jquery-2.1.3.min.js
Failed to load resource: net::ERR_FILE_NOT_FOUND bootstrap.min.js
Failed to load resource: net::ERR_FILE_NOT_FOUND pace.min.js
Failed to load resource: net::ERR_FILE_NOT_FOUND script.js'%20%%7D
Failed to load resource: net::ERR_FILE_NOT_FOUND modernizr.custom.js
我又检查了路径,这个路径完全是按照步骤来建的,没有错误,检查了好几遍,真的不知道路径有什么问题。css和js文件都在E:\workspace\blogproject\blog\static这个路径下,emmmmmm,templates/blog/index.html的css部分列举一个就是这样的:<link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">,跟博主一样。不知道还有哪里不对,T_T。再次感谢博主的回复,谢谢!
在settings中设置静态文件的路径了吗
在setting中设置了,清空缓存,还是乱码
目录层级不一样,报错信息里有的,仔细看看
fafsdfa
fadfsda
范德萨发生的防守打法
我的首页提示:<QuerySet [<Post: Post object (1)>, <Post: Post object (2)>]> 该怎么解决呢?
不要直接 {{ post }},而是引用其属性 {{ post.title }}
为什么会报这个错呢?'endfor'. Did you forget to register or load this tag?,empty也是
为什么不能直接把css和js文件夹直接复制粘贴进去?我只好建立了一个css js文件夹,然后把里面的文件复制粘贴进去。。麻烦了许多。
为什么修改后还是混乱的呢
已解决,刚开始没有在虚拟环境下打开,用虚拟环境打开就可以了
请问为什么我打开的链接是这样的
没办法发图片??
样式加载304 304 Not Modified
去掉 <!DOCTYPE html>后可以了。原因不明。
single.html要改成index.html?
这个不用改啊,single页是浏览文章的页面,点击标题跳转至浏览页面,没毛病
渡水复渡水
测试发送评论信息
博主,感谢您优质的教程,有个疑问,为什么要在index.html文档最后加上<script src="{% static 'blog/js/script.js' %}"></script>,而不是跟其他一起加上去呢?谢谢
测试层级结构
都不影响吧,只要正确引入了就好。
用 django2 版本的,需要在 setting.py 设置:STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static')] 才能加载 css js 文件
不用加啊
好吧,我搞错版本了
百度了一下静态文件,发现要添加个东西才可以,要不然加载不出样式.....................
Django添加静态文件有两种方法:首先setting.py配置文件中添加静态文件的路径:STATICFILES_DIRS = [ os.path.join(BASE_DIR, "statics"),] statices为你所建立的存放静态文件的文件夹名然后进行引用。1、html 文件中通过 /static/资源名的方式,就可以访问到资源2、①html 文件头部填写 {% load staticfiles %},②路径填写 {% static 'css/xx.css' %} #static 等于配置文件中的 STATIC_URL = '/static/',可以按照需要进行修改,意义不大就是了。
在浏览器也能显示正常的路径,为什么样式加载不出来呢?也没有报错
<link rel="stylesheet" href="/static/blog/css/bootstrap.min.css">
同问 本人使用的django2.0版本,请问与博文版本有什么需要注意的区别吗
这里是答案: https://docs.djangoproject.com/en/1.10/howto/static-files/
settings需要添加:
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),]
请问问题解决了吗,我也遇到了同样的问题,浏览器能够正确的显示链接: <link rel="stylesheet" href="/static/blog/css/pace.css">,但是还是无法加载样式,点击链接,浏览器显示:The requested URL /static/blog/css/highlights/github.css was not found on this server.
请问问题解决了吗,我也遇到了同样的问题,浏览器能够正确的显示链接: <link rel="stylesheet" href="/static/blog/css/pace.css">,但是还是无法加载样式,点击链接,浏览器显示:The requested URL /static/blog/css/pace.css was not found on this server.
不知道为啥,部署到服务器(Centos7)是没有问题的,但是本地(Windows 10)显示就是有问题,提示找不到文件。
那就不知道了,我用的mac ^_^
django2.0 部分地方将无法和本教程兼容。
在配置文件最后加上绝对路径,应该可以加载
```
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static/'),)
```
请问php格式的文件应该怎么样弄呢
php格式的文件只能用PHP解析吧,和Python没什么关系应该。
{ % for post in post_list % }
4 评论 588 阅读
继续阅读 →
{ % empty %}暂时还没有发布的文章!
{ % endfor %}
我的页面中为什么会显示{}中的内容
{ % 符号必须挨在一起,中间不能有空格!{%
即使没有挨在一起,也显示了
TemplateSyntaxError at /Invalid block tag on line 91: 'empty'. Did you forget to register or load this tag?
请问这个错误是什么情况啊?
博主,麻烦问一下为什么我的显示成这样
# 出现问题
## 问题描述:
> django.db.utils.OperationalError: no such column: blogapp_post.created_time
## 解决方案:
重新迁移数据库,执行***python manage.py migrate***在虚拟环境内
```cmd
python manage.py migrate
```
## 思考与总结
可能是我一开始打错了,将**created_time**错打成了**create_time**,后来忘记了做数据库迁移
正解!感谢~
博主你好 按你这章的操作,但是没有跳转detail.html
关于html引用css,js这个细节 我还有一点不明白 请教一下楼主
{% static 'blog/css/pace.css' %} 最终渲染的值是 /static/blog/css/pace.css。index.html在blogproject/template/blog 目录。 而我们的css文件在 blogproject/blog/static/blog/css目录。
即 index.html 绝对路径 blogproject/template/blog
pace.css 绝对路径 blogproject/blog/static/blog/css
他们绝对路径完全不同,在index.html 使用相对路径 /static/blog/css/pace.css。为什么会可以找到blogproject/blog/static/blog/css这个绝对路径
您的疑问与我的疑问相同,为什么index.html可以正确的找到css/js的文件,他们的位置在不同路径下,
是的 哈哈
也许这里是答案: https://docs.djangoproject.com/en/1.10/howto/static-files/
这个是正解
您好:
关于此博客我有两个疑问:
1 咱们在models.py中定义了函数,
def __str__(self):
return self.title
在交换环境下,我也看到了数据确实返回了tille的格式,
但是在index.html中,我们却用post.title,post.author等字段,
请问,这个函数的作用只是改变数据的显示?? 实际上仍然返回所有字段??
2 咱们在index.html中使用了{% static %}方法,我在日志中抓到的值为/static/blog/js/script.js,也就是在模板中的配置"{% static 'blog/js/script.js' %}">中,将setting.py的STATIC_URL = '/static/',与 'blog/js/script.js' 做了拼接,
疑问如下,
setting.py的配置STATIC_URL = '/static/',在/home/xushuangang/blogproject/blogproject下,BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))),那为什么会去查找blog/static,而不是BASE_DIR/static,或者说 他会依次查找BASE_DIR/static,INSTALLED_APPS 下所有的app/static???
为了避免和其它应用中的 CSS 和 JavaScript 文件命名冲突(别的应用下也可能有和 blog 应用下同名的 CSS 、JavaScript 文件),我们再在 static\ 目录下建立一个 blog 文件夹
直接放在blog/static下不行么? 其他app(如comment app)的目录不是comment/static 么? 为什么会混淆了?
django的app名不作为静态文件的命名空间好像。
可以在 根url 中添加 namespace
在修改模板前没问题 修改后打开首页显示A server error occurred. Please contact the administrator.
终端显示:pytz.exceptions.UnknownTimeZoneError: 'Asia/shanghai'[15/Oct/2017 03:07:57] "GET / HTTP/1.1" 500 59
已解决。。。 ‘Asia/shanghai’ 改为‘Asia/Shanghai’。。。留给和我一样粗心的人
感谢!!
为什么我的显示的是title test 。
之前的整数据库的时候,这是存过的数据,删了就显示‘暂时还没有发布的文章!’
有个问题,如果你是在css里面引入了字体,北京图片,那么要怎么配置路径?一个个去改吗?
大佬,关于静态文件夹的路径放置,是否放在项目文件下,放在app下也可以,别的应用路径也要去这个app下寻找css,js文件。还有为什么我{%load staticfiles %}会在页面顶部显示,element里面css,js也没用有效引入。。
解决了可能是版本问题,用的是{%load static from staticfiles%}
按照博主的教程做,代码一样的,目录也是,但是刷新index.html时,还是之前的混乱样式
我开始也是,后来发现是view.py中的index.html设置的路径不对
博主 为什么我在 post_list = Post.objects.all().order_by('-created_time') 这里 编译器提示我 Post 没有 objects 这个对象
你确定 Post 继承了 models.Model 么?
class Post(models.Model):
我应该是继承了,请问现在应该怎么办呢,博主
只能猜测你是不是导入 Post 出了问题,要确定你这里引用的 Post 就是你定义的 Post 模型。
可是我只有这一个Post ,这样的话 应该就是我定义的Post的吧
blog下的views的代码
from django.shortcuts import render
from .models import Post
from django.http import HttpResponse
def index(request):
post_list = Post.objects.all().order_by('-created_time') return render(request, 'blog/index.html', context={'post_list': post_list})
请问有什么问题吗
在 models.py 中 Post 类中 加一句 objects = models.Manager()
哇,真的可以了,请问为什么别人的可以,我的就需要这样一个语句呢
同样的问题
但是我的还是不行,这是为什么呢?
解决了,自己犯傻了,
博主为啥用你的index.html文件的代码,输出是空白
我也是空白,你是怎么解决的
博主,下面这个问题特别困惑,求解答?
Cannot resolve keyword 'create_time' into field. Choices are: author, author_id, body, category, category_id, created_time, excerpt, id, modified_time, tags, title
仅有一个异常信息很难定位问题所在,需要相关代码。
这个问题下面还有好多内容,在代码中标记的是{% for post in post_list %},不知道怎么修改,windows没问题,Mac就会出现这个问题
你好的,我也出现同样的问题了,请问这个是什么情况啊?
FieldError at /blog/Cannot resolve keyword 'created_time' into field. Choices are: author, author_id, body, category, category_id, create_time, excerpt, id, modified_time, tags, titleRequest Method:GETRequest URL:http://127.0.0.1:8000/blog/Django Version:1.11Exception Type:FieldErrorException Value:Cannot resolve keyword 'created_time' into field. Choices are: author, author_id, body, category, category_id, create_time, excerpt, id, modified_time, tags, titleException Location:/Users/bai/anaconda3/lib/python3.6/site-packages/django/db/models/sql/query.py in names_to_path, line 1362Python Executable:/Users/bai/anaconda3/bin/pythonPython Version:3.6.0Python Path:['/Users/bai/pyproject/pdjango/myblogs', '/Users/bai/anaconda3/lib/python36.zip', '/Users/bai/anaconda3/lib/python3.6', '/Users/bai/anaconda3/lib/python3.6/lib-dynload', '/Users/bai/anaconda3/lib/python3.6/site-packages', '/Users/bai/anaconda3/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg', '/Users/bai/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/bai/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg']Server time:星期五, 26 一月 2018 15:49:09 +0800
我不知道发生了什么错误,我是按照您的代码来着的。
因为post没有create_time这个属性,要改成created_time
我犯了这个错误,桥代码时候,tab错了也不知道
为什么当我把 DEBUG设为true的时候页面样式是正确的,变成false的时候页面样式就乱了,终端提示说,GET 不到css和js文件了?
开发服务器在 DEBUG设为true的时候无法处理静态文件。
那么请问怎样才能在DEBUG为False的情况下GET到静态文件?
可以使用 nginx 处理静态文件,具体请百度或者查看 nginx 的文档
谢谢!已经搞定了!
博主,你好,请问下,我在后台添加了文章,结果还是显示“暂时还没发布文章!”下面是我的代码:
<main class="col-md-8">{% for post in post_list %} <article class="post post-{{ post.pk }}"> <header class="entry-header"> <h1 class="entry-title"> <a href="single.html">{{ post.title }}</a> </h1> <div class="entry-meta"> <span class="post-category"><a href="#">{{ post.category.name }}</a></span> <span class="post-date"><a href="#"><time class="entry-date" datetime="{{ post.created_time }}">{{ post.creaed_time }}</time></a></span> <span class="post-author"><a href="#">{{ post.author }}</a></span> <span class="comments-link"><a href="#">4 评论</a></span> <span class="views-count"><a href="#">588 阅读</a></span> </div> </header> <div class="entry-content clearfix"> <p>{{ post.excerpt }}</p> <div class="read-more cl-effect-14"> <a href="#" class="more-link">继续阅读 <span class="meta-nav">→</span></a> </div> </div> </article>{% empty %} <div class="no-post">暂时还没发布文章!</div>{% endfor %}
post_list 已从视图函数中传递给了模板?并且模板变量设置为 post_list
搞定了,就是忘了添加视图了,太粗心了⊙﹏⊙‖∣,谢谢博主
我刚才跟你一样的问题,然后重新文章,发现漏了blog/views.py的修改,本来想跟你说一下,看到大神已经给你回复了,不得不说大神回复真及时啊
当时没仔细看,漏看了那段代码了
博主好,请问对<article>标签用{% for %}标签进行处理后运行python manage.py runserver成功启动服务后,在浏览器上运行http://127.0.0.1:8000/会失败,之后后台会显示编码错误:
File "C:\Python3\lib\traceback.py", line 520, in _load_lines frame.line File "C:\Python3\lib\traceback.py", line 282, in line self._line = linecache.getline(self.filename, self.lineno).strip() File "C:\Python3\lib\linecache.py", line 16, in getline lines = getlines(filename, module_globals) File "C:\Python3\lib\linecache.py", line 47, in getlines return updatecache(filename, module_globals) File "C:\Python3\lib\linecache.py", line 137, in updatecache lines = fp.readlines() File "C:\Python3\lib\codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final)UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 272: invalid start byte
这个可能是你的 html 模板编码问题,尝试重新以 utf-8 编码保存,还是不行就复制里面的内容,删了重新创建一个 utf-8 编码的文件。
按照步骤重新将html文件重新改了一遍,编码确实是用的utf-8,但是还是没用。我觉得是因为从数据库读出内容后在传入页面的过程中出了编码的问题,而不是html文件的编码问题。实在不知道该怎么改了,求博主帮忙想想,谢谢了
这个问题还真没有遇到过,看看数据库的文档怎么说吧?很多人使用 sqlite,mysql 都没这个编码问题。
嗯 我自己再慢慢找解决方法。我用的也是MySQL。。。。。
我感觉你是用pycharm,如果是,把右下角的编码gbk编码改成utf-8
修改完后python manage.py runserver 启动服务成功后在浏览器上运行http://0.0.0.0:8080/显示网站错误。。。。
以为8080端口被占用,修改端口python manage.py runserver 0.0.0.0:8081 启动服务成功,浏览器运行还是失败。
博主,没找到html里面有article这个标签啊
在仔细找找,最好用 ctrl+F 搜索
一般我把static目录写到根下面和templates同级然后再配置STATICFILES_DIRS
博主这样把static写在app下不配置STATICFILES_DIRS是否意味着django会自动从app下去拼接静态资源路径。如settings里只写STATIC_URL = '/static/' 拼接后路径为/static/blog/css/pace.css,实际上他就是从app的根路径开始找的
对,现在 app 下 django 会自动寻找,无需配置。否则需要配置 STATICFILES_DIRS
大哥 我这渲染咋不行啊 {% for post in post_list %}一直被红色标记视图函数也没错啊
不行具体指的是什么?没有数据?
我和他遇见的问题一样,在windows下没问题,但是一到macOS就会出现这个问题。
Cannot resolve keyword 'created_time' into field. Choices are: author, author_id, body, category, category_id, create_time, excerpt, id, modified_time, tags, title
标红 {% for post in post_list %}
您好 请问您解决了么
02/Aug/2017 10:48:26] "GET /static/blog/js/jquery-2.1.3.min.js HTTP/1.1" 404 1697
[02/Aug/2017 10:48:26] "GET /static/blog/css/pace.css HTTP/1.1" 404 1667
[02/Aug/2017 10:48:26] "GET /static/blog/css/bootstrap.min.css HTTP/1.1" 404 1694
[02/Aug/2017 10:48:26] "GET /static/blog/css/custom.css HTTP/1.1" 404 1673
[02/Aug/2017 10:48:26] "GET /static/blog/js/bootstrap.min.js HTTP/1.1" 404 1688
[02/Aug/2017 10:48:26] "GET /static/blog/js/pace.min.js HTTP/1.1" 404 1673
[02/Aug/2017 10:48:26] "GET /static/blog/js/modernizr.custom.js HTTP/1.1" 404 1697
[02/Aug/2017 10:48:26] "GET /static/blog/js/script.js HTTP/1.1" 404 1667
还是显示乱的,怎么回事
看上去像是你的 static 设置有误,严格按照教程重做一遍,注意静态文件的存放路径,如果还有问题,请把相关代码贴上来才好定问问题所在。
css、js、img 文件夹拷贝进blogproject/blog/static/blog这个目录
我之前目录整错了,跟你一样的错误。
打卡打卡
修改后还是混乱的,已经清理缓存了
已解决
您好,请问如何解决的?为什么我加了{% load staticfiles %}他的下一行<!DOCTYPE html>显示有错误,而且格式还是错乱的
我直接复制了博主的代码,样式还是乱的,请问您是如何解决的?
我最开始按照模板给出的CSS文件进行{%%},修改也是乱的,仔细看了看,发现是其中两个css文件路径 没有带上blog/。 填上就好了。
Bootstrap也挺不错的,避免了很多麻烦的
博主好,
...
这个article是由什么定义的呢?是django还是bootstrap?
article 是 html 定义的标签,类似于 div
{% load staticfiles %}
可以显示了,没有清缓存
在登陆后,点击Black& White按钮,,出现[0-9]+)/$ [name='detail']
Page not found (404)
Request Method: GET
Request URL: http://127.0.0.1:8000/index.html
Using the URLconf defined in blogproject.urls, Django tried these URL patterns, in this order:
^admin/
^$ [name='index']
^post/(?P
The current URL, index.html, didn't match any of these.,,,
这是什么原因??明明已经有index.html 文件了,,为甚么get不到呢?
样式一直是原先混乱那种
Static 引入静态文件。
博主,你好
想请教一下
私下按教程更改后,好像并没有正确使用static
后台添加博文后,也无法在首页显示,一直显示“暂时还没有发布的文章!”
请问您能看出来,问题出在哪儿吗?
==对照了几遍,觉得没设置错
麻烦啦!
以下是输出的log:
[13/May/2017 16:42:19] "GET / HTTP/1.1" 200 5026
Not Found: /css/bootstrap.min.css
[13/May/2017 16:42:19] "GET /css/bootstrap.min.css HTTP/1.1" 404 2134
Not Found: /css/pace.css
[13/May/2017 16:42:19] "GET /css/pace.css HTTP/1.1" 404 2107
Not Found: /css/custom.css
[13/May/2017 16:42:19] "GET /css/custom.css HTTP/1.1" 404 2113
Not Found: /js/bootstrap.min.js
Not Found: /js/jquery-2.1.3.min.js
[13/May/2017 16:42:19] "GET /js/jquery-2.1.3.min.js HTTP/1.1" 404 2137
Not Found: /js/pace.min.js
Not Found: /js/modernizr.custom.js
[13/May/2017 16:42:19] "GET /js/bootstrap.min.js HTTP/1.1" 404 2128
[13/May/2017 16:42:19] "GET /js/pace.min.js HTTP/1.1" 404 2113
[13/May/2017 16:42:19] "GET /static/blog/js/pace/min.js HTTP/1.1" 404 1670
Not Found: /js/script.js
[13/May/2017 16:42:19] "GET /js/modernizr.custom.js HTTP/1.1" 404 2137
[13/May/2017 16:42:19] "GET /js/script.js HTTP/1.1" 404 2107
[13/May/2017 16:42:19] "GET /static/blog/js/pace/min.js HTTP/1.1" 404 1670
Not Found: /js/script.js
[13/May/2017 16:42:20] "GET /js/script.js HTTP/1.1" 404 2107
好像知道哪儿错了,我在html用#当注释了-- sorry,我去试试看