真正的 Django 博客首页视图

2017-04-1092162 阅读143 评论

在此之前我们已经编写了 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 &amp; 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 &amp; 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 循环在这里结束了。

你可能不太理解模板中的 postpost_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>

我们把标题替换成 posttitle 属性值。注意要把它包裹在模板变量里,因为它最终要被替换成实际的 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

如果遇到问题,请通过下面的方式寻求帮助。

-- EOF --

143 评论
登录后回复
Stone
2020-07-28 21:10:52

看博主文章第 N 天, 痛哭流涕中···

回复
全世界就你爱嘚瑟
2019-08-26 11:38:45

友情提示:这一部放好css再怎么刷新样式都不出来,重新启动下server就好了

回复
火腿烧豆腐
2019-07-15 14:21:06

走到这里的时候数据库里面不是存着那条test的文章吗,为什么是空呢

回复
淮竹泡影
2019-06-25 13:18:48

博主,我想问一下为什么一定要新建个static目录,然后把模板放进去呢?我把模板拷贝到templates/blog/下面,难道不是一样的吗?

回复
DocterWhom
2019-03-09 23:16:17

另外相信很多人看到这里关于这个静态模板标签不是很理解,Django2.0的中文官方文档可供查阅https://docs.djangoproject.com/zh-hans/2.0/intro/tutorial06/

回复
DocterWhom
2019-03-09 23:10:29

友情提示下和我一样HTML语言不怎么懂的同学。

语句中<link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">的static两边必须是带空格的,才会被当做是模板标签来处理。

回复
xiepeng0234 DocterWhom
2019-07-24 14:13:07

回复
imostro
2018-10-26 17:00:38

{% for post in post_list %}这一步中出现了django.db.utils.OperationalError: no such column: blog_post.title错误,不知道怎么解决

回复
追梦人物 imostro
2018-11-24 17:03:51

运行一下 python manage.py makemigrations 和 migrate 命令试一下呢

回复
hq2018
2018-09-06 17:42:37

按照博主的步骤一步步来的,不知道为什么“处理静态文件”那一节我的网页打开总是混乱的,各种细节都检查了,没有问题,但是页面就是混乱。win7系统,Python3.6.6,Django版本用的跟博主一样,好气啊!重新做了一遍还是那样。

回复
追梦人物 hq2018
2018-09-10 12:58:26

浏览器调试看一下引入静态资源是否404?如果不是的话清除一浏览器缓存试试。

回复
hq2018 追梦人物
2018-09-10 16:44:00

感谢博主的回复。我试着调试之后显示

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。再次感谢博主的回复,谢谢!

回复
GAKKI我女神 hq2018
2018-09-16 22:02:45

在settings中设置静态文件的路径了吗


STATICFILES_DIRS = (
#static前面不能加斜杠
os.path.join(BASE_DIR, "static"),
)
回复
hq2018 GAKKI我女神
2018-09-17 10:41:53

在setting中设置了,清空缓存,还是乱码

回复
jizhonghua768 hq2018
2018-11-27 17:42:43

目录层级不一样,报错信息里有的,仔细看看

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'blog/static'),
)
回复
追梦人物 hq2018
2020-02-22 15:15:12

fafsdfa

回复
追梦人物 追梦人物
2020-02-22 15:15:28

fadfsda

回复
追梦人物 追梦人物
2020-02-22 15:15:38

范德萨发生的防守打法

回复
acaiblog
2018-09-01 18:49:07

我的首页提示:<QuerySet [<Post: Post object (1)>, <Post: Post object (2)>]>  该怎么解决呢?

回复
追梦人物 acaiblog
2018-09-05 12:14:55

不要直接 {{ post }},而是引用其属性 {{ post.title }}

回复
半夏的距离
2018-07-04 20:18:17

为什么会报这个错呢?'endfor'. Did you forget to register or load this tag?,empty也是

回复
-Lupy
2018-07-04 15:55:41

为什么不能直接把css和js文件夹直接复制粘贴进去?我只好建立了一个css  js文件夹,然后把里面的文件复制粘贴进去。。麻烦了许多。

回复
阿米-Cc
2018-06-22 21:01:39

为什么修改后还是混乱的呢

回复
阿米-Cc 阿米-Cc
2018-06-24 14:53:58

已解决,刚开始没有在虚拟环境下打开,用虚拟环境打开就可以了

回复
阿米-Cc
2018-06-21 15:55:38

Image请问为什么我打开的链接是这样的

回复
阿米-Cc 阿米-Cc
2018-06-21 15:56:29

没办法发图片??

回复
张小二_tiny
2018-05-07 16:27:38

样式加载304  304 Not Modified

回复
张小二_tiny 张小二_tiny
2018-05-07 16:47:16

去掉 <!DOCTYPE html>后可以了。原因不明。

回复
-Lupy
2018-04-20 11:42:34
链接文字<h1 class="entry-title">
    <a href="single.html">{{ post.title }}</a>
</h1>

single.html要改成index.html?

回复
huyang233 -Lupy
2018-04-25 11:37:42

这个不用改啊,single页是浏览文章的页面,点击标题跳转至浏览页面,没毛病

回复
-Lupy
2018-04-20 11:40:08

这里的标签是不是错了

回复
scrapy
2018-04-09 10:08:19

渡水复渡水

回复
scrapy scrapy
2018-04-09 10:08:41

测试发送评论信息

回复
jizhongwei
2018-03-07 08:50:22

博主,感谢您优质的教程,有个疑问,为什么要在index.html文档最后加上<script src="{% static 'blog/js/script.js' %}"></script>,而不是跟其他一起加上去呢?谢谢

回复
scrapy jizhongwei
2018-04-09 11:37:03

测试层级结构

回复
追梦人物 jizhongwei
2018-04-14 13:14:30

都不影响吧,只要正确引入了就好。

回复
shaoyan
2018-02-26 16:50:48

用 django2 版本的,需要在 setting.py 设置:STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static')] 才能加载 css js 文件

回复
简单分行 shaoyan
2018-02-26 23:51:43

不用加啊

回复
简单分行 简单分行
2018-02-27 19:55:35

好吧,我搞错版本了

回复
秋秋秋秋方
2018-02-26 14:27:25

百度了一下静态文件,发现要添加个东西才可以,要不然加载不出样式.....................


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/',可以按照需要进行修改,意义不大就是了。

回复
等一片枫叶
2017-12-30 14:52:28

在浏览器也能显示正常的路径,为什么样式加载不出来呢?也没有报错

 <link rel="stylesheet" href="/static/blog/css/bootstrap.min.css">

回复
周磊 等一片枫叶
2018-01-29 11:43:53

同问 本人使用的django2.0版本,请问与博文版本有什么需要注意的区别吗

回复
fans 等一片枫叶
2018-02-02 10:52:04

这里是答案: https://docs.djangoproject.com/en/1.10/howto/static-files/

settings需要添加:

STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),]

回复
何睿 等一片枫叶
2018-02-10 13:11:18

请问问题解决了吗,我也遇到了同样的问题,浏览器能够正确的显示链接: <link rel="stylesheet" href="/static/blog/css/pace.css">,但是还是无法加载样式,点击链接,浏览器显示:The requested URL /static/blog/css/highlights/github.css was not found on this server.

回复
何睿 等一片枫叶
2018-02-10 13:12:23

请问问题解决了吗,我也遇到了同样的问题,浏览器能够正确的显示链接: <link rel="stylesheet" href="/static/blog/css/pace.css">,但是还是无法加载样式,点击链接,浏览器显示:The requested URL /static/blog/css/pace.css was not found on this server.

回复
何睿 fans
2018-02-10 16:49:38

不知道为啥,部署到服务器(Centos7)是没有问题的,但是本地(Windows 10)显示就是有问题,提示找不到文件。

回复
fans 何睿
2018-02-12 16:42:47

那就不知道了,我用的mac ^_^

回复
追梦人物 周磊
2018-04-20 13:10:14

django2.0 部分地方将无法和本教程兼容。

回复
XZ 何睿
2018-08-25 22:59:47

在配置文件最后加上绝对路径,应该可以加载

```

STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static/'),)

```

回复
cbwood
2017-12-29 13:54:31

请问php格式的文件应该怎么样弄呢

回复
fans cbwood
2018-02-02 10:53:25

php格式的文件只能用PHP解析吧,和Python没什么关系应该。

回复
ultra-hao
2017-12-18 17:04:49

{ % for post in post_list % }  

4 评论 588 阅读 

 继续阅读 →

{ % empty %}暂时还没有发布的文章!

 { % endfor %} 


我的页面中为什么会显示{}中的内容

回复
追梦人物 ultra-hao
2017-12-21 18:54:27

{ % 符号必须挨在一起,中间不能有空格!{%

回复
安天崖 追梦人物
2018-04-01 11:51:23

即使没有挨在一起,也显示了

回复
好汉源6475728697 追梦人物
2019-05-28 00:25:41

TemplateSyntaxError at /Invalid block tag on line 91: 'empty'. Did you forget to register or load this tag?

请问这个错误是什么情况啊?

回复
ultra-hao
2017-12-18 17:00:57

Image

博主,麻烦问一下为什么我的显示成这样

回复
Simoral
2017-12-07 17:46:46

# 出现问题

## 问题描述:

> django.db.utils.OperationalError: no such column: blogapp_post.created_time

## 解决方案:

重新迁移数据库,执行***python manage.py migrate***在虚拟环境内

```cmd

python manage.py migrate

```

## 思考与总结

可能是我一开始打错了,将**created_time**错打成了**create_time**,后来忘记了做数据库迁移

回复
HAOHAOXUEXI5776 Simoral
2018-05-10 23:29:28

正解!感谢~

回复
dragon1061
2017-12-04 10:48:54

博主你好 按你这章的操作,但是没有跳转detail.html

回复
rookie250
2017-11-18 16:43:15

关于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这个绝对路径

回复
xushuangang rookie250
2017-11-19 15:06:02

您的疑问与我的疑问相同,为什么index.html可以正确的找到css/js的文件,他们的位置在不同路径下,

回复
rookie250 xushuangang
2017-11-19 16:37:53

是的 哈哈

回复
rookie250 xushuangang
2017-11-19 18:58:43
回复
口腔哥 rookie250
2017-12-04 20:10:49

这个是正解

回复
xushuangang
2017-11-18 14:47:18

您好:

关于此博客我有两个疑问:

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???

回复
rookie250
2017-11-17 14:32:27

为了避免和其它应用中的 CSS 和 JavaScript 文件命名冲突(别的应用下也可能有和 blog 应用下同名的 CSS 、JavaScript 文件),我们再在 static\ 目录下建立一个 blog 文件夹

直接放在blog/static下不行么? 其他app(如comment app)的目录不是comment/static 么? 为什么会混淆了?

回复
追梦人物 rookie250
2017-11-17 19:16:13

django的app名不作为静态文件的命名空间好像。

回复
jing.wang 追梦人物
2017-12-03 16:12:13

可以在 根url 中添加 namespace

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'',include('blog.urls', namespace="home")),
]

回复
YoJohnDoe
2017-10-15 03:20:21

在修改模板前没问题 修改后打开首页显示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

回复
YoJohnDoe YoJohnDoe
2017-10-15 03:29:54

已解决。。。 ‘Asia/shanghai’ 改为‘Asia/Shanghai’。。。留给和我一样粗心的人

回复
1007307796 YoJohnDoe
2018-05-11 21:57:36

感谢!!

回复
你这坏孩子K
2017-10-13 16:56:05

为什么我的显示的是title test 。

回复
张克臣 你这坏孩子K
2018-03-04 16:59:23

之前的整数据库的时候,这是存过的数据,删了就显示‘暂时还没有发布的文章!’

回复
edsszw
2017-10-03 00:10:53

有个问题,如果你是在css里面引入了字体,北京图片,那么要怎么配置路径?一个个去改吗?

回复
chenchong6
2017-09-26 18:30:27

大佬,关于静态文件夹的路径放置,是否放在项目文件下,放在app下也可以,别的应用路径也要去这个app下寻找css,js文件。还有为什么我{%load staticfiles %}会在页面顶部显示,element里面css,js也没用有效引入。。

回复
chenchong6 chenchong6
2017-09-27 00:12:06

解决了可能是版本问题,用的是{%load static from staticfiles%}   

回复
彩色的小丑
2017-09-21 14:21:50

按照博主的教程做,代码一样的,目录也是,但是刷新index.html时,还是之前的混乱样式

回复
Malone1996 彩色的小丑
2017-10-29 14:58:15

我开始也是,后来发现是view.py中的index.html设置的路径不对

回复
-冯龙
2017-09-21 10:55:01

博主 为什么我在 post_list = Post.objects.all().order_by('-created_time') 这里 编译器提示我 Post 没有 objects 这个对象

回复
追梦人物 -冯龙
2017-09-24 18:12:56

你确定 Post 继承了 models.Model 么?

回复
-冯龙 追梦人物
2017-09-25 09:21:29

class Post(models.Model):   

我应该是继承了,请问现在应该怎么办呢,博主

回复
追梦人物 -冯龙
2017-09-25 14:40:51

只能猜测你是不是导入 Post 出了问题,要确定你这里引用的 Post 就是你定义的 Post 模型。

回复
-冯龙 追梦人物
2017-09-25 18:04:51

可是我只有这一个Post ,这样的话 应该就是我定义的Post的吧

回复
-冯龙 追梦人物
2017-09-25 21:57:08

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})

请问有什么问题吗 

回复
Frozon Horizon -冯龙
2017-09-29 08:37:34

在 models.py 中 Post 类中 加一句 objects = models.Manager()

回复
-冯龙 Frozon Horizon
2017-09-29 17:05:34

哇,真的可以了,请问为什么别人的可以,我的就需要这样一个语句呢

回复
bingcheng -冯龙
2018-05-12 18:46:10

同样的问题

回复
zjianfa Frozon Horizon
2018-09-28 17:32:50

但是我的还是不行,这是为什么呢?

回复
用户5667966604
2017-09-17 01:12:16

解决了,自己犯傻了,

回复
用户5667966604
2017-09-17 00:07:23

博主为啥用你的index.html文件的代码,输出是空白

回复
lzj24 用户5667966604
2017-09-20 10:35:01

我也是空白,你是怎么解决的

回复
小王思雨
2017-09-13 18:44:32

Image

回复
小王思雨
2017-09-11 22:26:32

博主,下面这个问题特别困惑,求解答?

Cannot resolve keyword 'create_time' into field. Choices are: author, author_id, body, category, category_id, created_time, excerpt, id, modified_time, tags, title

回复
追梦人物 小王思雨
2017-09-12 09:36:52

仅有一个异常信息很难定位问题所在,需要相关代码。

回复
Tove_cv 小王思雨
2017-10-07 15:37:46
在 views.py 中,post_list = Post.objects.all().order_by('-created_time') 是 created_time 不是 create_time , 少了一个字母 d 。
回复
mengfan1018 Tove_cv
2017-12-17 17:02:10

这个问题下面还有好多内容,在代码中标记的是{% for post in post_list %},不知道怎么修改,windows没问题,Mac就会出现这个问题

回复
MarioBai 追梦人物
2018-01-26 15:53:11

你好的,我也出现同样的问题了,请问这个是什么情况啊?

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


我不知道发生了什么错误,我是按照您的代码来着的。

回复
Renewingwcc 小王思雨
2018-03-12 20:53:25

因为post没有create_time这个属性,要改成created_time

回复
讷讷0给你 Tove_cv
2018-06-27 12:15:09

我犯了这个错误,桥代码时候,tab错了也不知道

回复
hstk
2017-09-07 14:53:43

为什么当我把 DEBUG设为true的时候页面样式是正确的,变成false的时候页面样式就乱了,终端提示说,GET 不到css和js文件了?

回复
追梦人物 hstk
2017-09-07 18:57:34

开发服务器在 DEBUG设为true的时候无法处理静态文件。

回复
Shaoze LUO 追梦人物
2017-09-28 16:45:04

那么请问怎样才能在DEBUG为False的情况下GET到静态文件?

回复
追梦人物 Shaoze LUO
2017-09-29 12:09:15

可以使用 nginx 处理静态文件,具体请百度或者查看 nginx 的文档

回复
Shaoze LUO 追梦人物
2017-09-30 18:24:03

谢谢!已经搞定了!

回复
chsword-陳
2017-09-06 21:30:01

博主,你好,请问下,我在后台添加了文章,结果还是显示“暂时还没发布文章!”下面是我的代码:

<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 %}

回复
追梦人物 chsword-陳
2017-09-07 10:02:28

post_list 已从视图函数中传递给了模板?并且模板变量设置为 post_list

回复
chsword-陳 追梦人物
2017-09-07 10:12:56

搞定了,就是忘了添加视图了,太粗心了⊙﹏⊙‖∣,谢谢博主

回复
heidanchaofanhei chsword-陳
2017-09-07 21:56:04

我刚才跟你一样的问题,然后重新文章,发现漏了blog/views.py的修改,本来想跟你说一下,看到大神已经给你回复了,不得不说大神回复真及时啊

回复
chsword-陳 heidanchaofanhei
2017-09-08 14:47:26

当时没仔细看,漏看了那段代码了

回复
Rayutn
2017-09-06 14:29:03

博主好,请问对<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

回复
追梦人物 Rayutn
2017-09-06 15:28:16

这个可能是你的 html 模板编码问题,尝试重新以 utf-8 编码保存,还是不行就复制里面的内容,删了重新创建一个 utf-8 编码的文件。

回复
Rayutn 追梦人物
2017-09-06 16:11:00

按照步骤重新将html文件重新改了一遍,编码确实是用的utf-8,但是还是没用。我觉得是因为从数据库读出内容后在传入页面的过程中出了编码的问题,而不是html文件的编码问题。实在不知道该怎么改了,求博主帮忙想想,谢谢了

回复
追梦人物 Rayutn
2017-09-06 16:35:27

这个问题还真没有遇到过,看看数据库的文档怎么说吧?很多人使用 sqlite,mysql 都没这个编码问题。

回复
Rayutn 追梦人物
2017-09-06 17:37:26

嗯  我自己再慢慢找解决方法。我用的也是MySQL。。。。。

回复
fshgrym Rayutn
2017-10-31 21:33:13

我感觉你是用pycharm,如果是,把右下角的编码gbk编码改成utf-8

回复
Rayutn
2017-09-06 12:47:02

修改完后python manage.py runserver 启动服务成功后在浏览器上运行http://0.0.0.0:8080/显示网站错误。。。。

以为8080端口被占用,修改端口python manage.py runserver 0.0.0.0:8081 启动服务成功,浏览器运行还是失败。

回复
bumian
2017-09-05 15:54:48

博主,没找到html里面有article这个标签啊

回复
追梦人物 bumian
2017-09-05 16:03:29

在仔细找找,最好用 ctrl+F 搜索

回复
唯J王道
2017-08-16 16:01:48

一般我把static目录写到根下面和templates同级然后再配置STATICFILES_DIRS
博主这样把static写在app下不配置STATICFILES_DIRS是否意味着django会自动从app下去拼接静态资源路径。如settings里只写STATIC_URL = '/static/' 拼接后路径为/static/blog/css/pace.css,实际上他就是从app的根路径开始找的

回复
追梦人物 唯J王道
2017-08-16 17:18:20

对,现在 app 下 django 会自动寻找,无需配置。否则需要配置 STATICFILES_DIRS

回复
米粥fly怕素色pool
2017-08-06 09:32:08

大哥 我这渲染咋不行啊 {% for post in post_list %}一直被红色标记视图函数也没错啊

回复
追梦人物 米粥fly怕素色pool
2017-08-06 11:03:10

不行具体指的是什么?没有数据?

回复
mengfan1018 追梦人物
2017-12-17 16:59:08

我和他遇见的问题一样,在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 %}

回复
Timelomo 米粥fly怕素色pool
2018-10-15 19:52:50

您好 请问您解决了么

回复
jackhanzy
2017-08-02 18:55:20

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

还是显示乱的,怎么回事

回复
追梦人物 jackhanzy
2017-08-04 15:04:10

看上去像是你的 static 设置有误,严格按照教程重做一遍,注意静态文件的存放路径,如果还有问题,请把相关代码贴上来才好定问问题所在。

回复
志子杰-勇士哥 jackhanzy
2017-09-01 12:03:48

css、js、img 文件夹拷贝进blogproject/blog/static/blog这个目录
我之前目录整错了,跟你一样的错误。

回复
smilexnan
2017-07-28 00:22:22

打卡打卡

回复
26岁且一事无成
2017-07-22 15:45:10

修改后还是混乱的,已经清理缓存了

回复
26岁且一事无成 26岁且一事无成
2017-07-24 10:02:06

已解决

回复
zhuxinxia1992 26岁且一事无成
2017-07-26 11:42:12

您好,请问如何解决的?为什么我加了{% load staticfiles %}他的下一行<!DOCTYPE html>显示有错误,而且格式还是错乱的

回复
小明你哦 26岁且一事无成
2017-09-19 20:26:25

我直接复制了博主的代码,样式还是乱的,请问您是如何解决的?

回复
YoJohnDoe 小明你哦
2017-10-15 01:52:50

我最开始按照模板给出的CSS文件进行{%%},修改也是乱的,仔细看了看,发现是其中两个css文件路径 没有带上blog/。 填上就好了。

回复
杨晟泽
2017-07-19 13:02:49

Bootstrap也挺不错的,避免了很多麻烦的

回复
美图公子
2017-07-11 21:51:01

博主好,


...

这个article是由什么定义的呢?是django还是bootstrap?

回复
追梦人物 美图公子
2017-07-11 22:21:11

article 是 html 定义的标签,类似于 div

回复
wlz
2017-06-20 18:25:19

{% load staticfiles %}

Black & White ` 修改后布局还说混乱的
回复
wlz wlz
2017-06-20 18:49:02

可以显示了,没有清缓存

回复
稀里哗啦NZND
2017-06-12 11:58:25

在登陆后,点击Black& White按钮,,出现
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[0-9]+)/$ [name='detail']
The current URL, index.html, didn't match any of these.,,,
这是什么原因??明明已经有index.html 文件了,,为甚么get不到呢?

回复
liuchengfei
2017-05-25 20:30:25

样式一直是原先混乱那种

回复
追梦人物 liuchengfei
2017-05-25 23:29:47

Static 引入静态文件。

回复
gleesu
2017-05-13 16:45:32

博主,你好
想请教一下
私下按教程更改后,好像并没有正确使用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

回复
gleesu gleesu
2017-05-13 16:49:01

好像知道哪儿错了,我在html用#当注释了-- sorry,我去试试看

回复