在 Django Admin 后台发布文章

51363 118 2017年4月11日

在此之前我们完成了 Django 博客首页视图的编写,我们希望首页展示发布的博客文章列表,但是它却抱怨:暂时还没有发布的文章!如它所言,我们确实还没有发布任何文章,本节我们将使用 Django 自带的 Admin 后台来发布我们的博客文章。

创建 Admin 后台管理员账户

要想进入Django Admin 后台,首先需要创建一个超级管理员账户。我们在 让 Django 完成翻译:迁移数据库 中已经创建了一个后台账户,但如果你没有按照前面的步骤创建账户的话,可以运行 python manage.py createsuperuser 命令新建一个:

python manage.py createsuperuser

Username (leave blank to use 'zmrenwu@163.com'):  admin
Email address:  admin@example.com
Warning: Password input may be echoed.
Password:  ******
Warning: Password input may be echoed.
Password (again):  ******
Superuser created successfully.

注意:在命令行输入密码时可能不会显示输入的字符,不要以为键盘坏了,照正常的方式输入密码即可。

在 Admin 后台注册模型

要在后台注册我们自己创建的几个模型,这样 Django Admin 才能知道它们的存在,注册非常简单,只需要在 blog\admin.py 中加入下面的代码:

blog/admin.py

from django.contrib import admin
from .models import Post, Category, Tag

admin.site.register(Post)
admin.site.register(Category)
admin.site.register(Tag)

激活虚拟环境,运行开发服务器,访问 http://127.0.0.1:8000/admin/ ,就进入了到了Django Admin 后台登录页面,输入刚才创建的管理员账户密码就可以登录到后台了。

Django Admin 后台

可以看到我们刚才注册的三个模型了,点击 Posts 后面的增加按钮,将进入添加 Post 的页面,也就是新增博客文章。然后在相关的地方输入一些测试用的内容,增加完后点击保存,这样文章就添加完毕了,你也可以多添加几篇看看效果。注意每篇文章必须有一个分类,在添加文章时你可以选择已有分类。如果数据库中还没有分类,在选择分类时点击 Category 后面的 + 按钮新增一个分类即可。

Django Admin 后台新增文章

你可能想往文章内容中添加图片,但目前来说还做不到。在支持 Markdown 语法部分中将介绍如何在文章中插入图片的方法。

访问 http://127.0.0.1:8000/ 首页,你就可以看到你添加的文章列表了,下面是我所在环境的效果图:

博客首页显示的文章列表

定制 Admin 后台

在 admin post 列表页面,我们只看到了文章的标题,但是我们希望它显示更加详细的信息,这需要我们来定制 Admin 了,在 admin.py 添加如下代码:

blog/admin.py

from django.contrib import admin
from .models import Post, Category, Tag

class PostAdmin(admin.ModelAdmin):
    list_display = ['title', 'created_time', 'modified_time', 'category', 'author']

# 把新增的 PostAdmin 也注册进来
admin.site.register(Post, PostAdmin)
admin.site.register(Category)
admin.site.register(Tag)

由于如何定制 Admin 后台不是本教程的重点,这里只是为了简单地到达期望效果,因此不再对上述代码做过多解释。

刷新 Admin Post 列表页面,可以看到显示的效果好多了。

定制后的 Admin 文章列表页

总结

本章节的代码位于:Step7: publish posts using django admin

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

  • 在下方评论区留言。
  • 将问题的详细描述通过邮件发送到 djangostudyteam@163.com,一般会在 24 小时内回复。
  • Pythonzhcn 社区的新手问答版块 发布帖子。

-- EOF --

最后更新:2018-11-11 12:21:12

118 条评论 / 52 人参与
xiepeng0234

还是不太明白


EloneWangPy

大神,在后台发布文章后,主页还是显示原有内容,看了index.html的标签,展示的确实还是原有的4个文章,是需要对index文件中的标签进行修改吗?看您好像没有对该文件做修改,还是我错过了什么……

还有感谢您的分享!


EloneWangPy EloneWangPy

果然是我错过了。。哈哈


liutongyang

【python2】

由于python2的默认编码不是UTF-8

所以需要在models中加入以下4行代码 否则不能输入中文 会引发UnicodeEncodeError 

import sys 

from imp import reload 

reload(sys) 

sys.setdefaultencoding('utf-8')


zgGitHub

 Tags:   

Tag object (1)    

Tag object (2)    

Tag object (3)    

Tag object (4)    

Tag object (5)   


发布文章的时候,选择tags,这里面显示的都是这样的。。。,这个该怎么处理呀


風与飄颻

大神, 我的主页一直显示没有文章, 但是我是确定有发布文章的。而且显示没有找到那个CSS 的文件。麻烦请教一下,我要怎么去检查。我对了一遍的,没有发现哪里有出入的。感谢。 

Image

風与飄颻 風与飄颻

晕 我不能发布问题  一发布就是空白页面


風与飄颻 風与飄颻

[van@oc6344180105 blogproject]$ python manage.py runserver Performing system checks... System check identified no issues (0 silenced).July 12, 2018 - 20:50:33 Django version 1.11.14, using settings 'blogproject.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.[12/Jul/2018 20:50:44] "GET / HTTP/1.1" 200 8444 Not Found: /css/bootstrap.min.css [12/Jul/2018 20:50:44] "GET /css/bootstrap.min.css HTTP/1.1" 404 2160[12/Jul/2018 20:50:44] "GET /static/blog/css/bootstrap.min.css HTTP/1.1" 304 0 [12/Jul/2018 20:50:44] "GET /static/blog/css/pace.css HTTP/1.1" 304 0 [12/Jul/2018 20:50:44] "GET /static/blog/css/custom.css HTTP/1.1" 304 0 [12/Jul/2018 20:50:44] "GET /static/blog/js/jquery-2.1.3.min.js HTTP/1.1" 304 0[12/Jul/2018 20:50:44] "GET /static/blog/js/bootstrap.min.js HTTP/1.1" 304 0 [12/Jul/2018 20:50:44] "GET /static/blog/js/pace.min.js HTTP/1.1" 304 0[12/Jul/2018 20:50:44] "GET /static/blog/js/modernizr.custom.js HTTP/1.1" 304 0 [12/Jul/2018 20:50:44] "GET /static/blog/js/script.js HTTP/1.1" 304 0 Not Found: /favicon.ico [12/Jul/2018 20:50:58] "GET /favicon.ico HTTP/1.1" 404 2130 Not Found: /favicon.ico [12/Jul/2018 20:50:58] "GET /favicon.ico HTTP/1.1" 404 2130


風与飄颻 風与飄颻
[van@oc6344180105 blogproject]$ python manage.py runserver 
Performing system checks...
System check identified no issues (0 silenced).July 12, 2018 - 20:50:33
Django version 1.11.14, using settings 'blogproject.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
[12/Jul/2018 20:50:44] "GET / HTTP/1.1" 200 8444 Not Found: /css/bootstrap.min.css
[12/Jul/2018 20:50:44] "GET /css/bootstrap.min.css HTTP/1.1" 404 2160
[12/Jul/2018 20:50:44] "GET /static/blog/css/bootstrap.min.css HTTP/1.1" 304 0
[12/Jul/2018 20:50:44] "GET /static/blog/css/pace.css HTTP/1.1" 304 0
[12/Jul/2018 20:50:44] "GET /static/blog/css/custom.css HTTP/1.1" 304 0
[12/Jul/2018 20:50:44] "GET /static/blog/js/jquery-2.1.3.min.js HTTP/1.1" 304 0
[12/Jul/2018 20:50:44] "GET /static/blog/js/bootstrap.min.js HTTP/1.1" 304 0
[12/Jul/2018 20:50:44] "GET /static/blog/js/pace.min.js HTTP/1.1" 304 0
[12/Jul/2018 20:50:44] "GET /static/blog/js/modernizr.custom.js HTTP/1.1" 304 0
[12/Jul/2018 20:50:44] "GET /static/blog/js/script.js HTTP/1.1" 304 0 Not Found: /favicon.ico
[12/Jul/2018 20:50:58] "GET /favicon.ico HTTP/1.1" 404 2130 Not Found: /favicon.ico
[12/Jul/2018 20:50:58] "GET /favicon.ico HTTP/1.1" 404 2130

風与飄颻 風与飄颻
2
(blogproject_env) [van@oc6344180105 css]$ pwd
/home/van/blogproject_env/blogproject/blog/static/blog/css
(blogproject_env) [van@oc6344180105 css]$ ll
total 140
-rw-r--r--. 1 van van 117150 Jul 11 08:42 bootstrap.min.css
-rw-r--r--. 1 van van  14568 Jul 11 08:42 custom.css
drwx------. 2 van van   4096 Jul 11 08:42 highlights
-rw-r--r--. 1 van van    177 Jul 11 08:42 pace.css

3
(blogproject_env) [van@oc6344180105 blog]$ pwd
/home/van/blogproject_env/blogproject/template/blog
(blogproject_env) [van@oc6344180105 blog]$ ll
total 28
-rw-r--r--. 1 van van  9925 Jul 11 09:53 index.html
-rw-rw-r--. 1 van van 14541 Jul 11 08:50 index_kp.html
(blogproject_env) [van@oc6344180105 blog]$ vi index.html

風与飄颻 風与飄颻

4{% load staticfiles %} <!DOCTYPE html><html><head>     <title> The first Blog in 2018 </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="{% 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="{% 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' %}">


風与飄颻 風与飄颻
4
{% load staticfiles %} <!DOCTYPE html><html><head>    
<title> The first Blog in 2018 </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="{% 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="{% 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' %}">

風与飄颻 風与飄颻

抱歉 不知道为什么发不了, 发的好乱


追梦人物 [博主] 風与飄颻

可能是你视图中的模板变量和模板中的变量名不统一,仔细对比一下。


風与飄颻 追梦人物 [博主]


感谢大神!


lianxi

1231 


Wynnfan

博主你好,我在admin后台写的文章分类和标签都是汉字,保存了以后,显示category object ,tag object,是怎么回事


sheaye Wynnfan

在Category类和Tag类中定义__str__方法,返回name,例如:

class Category(models.Model): 

name = models.CharField(max_length=100)

def __str__(self): return self.name


安天崖

你好博主,新人有个问题帮忙解答下,前面没有错误,但在后台注册模型那里,我在admin.py里加入了如上代码,但正常进入admin页面后看不到那些模型,这个怎么解释0.0


安天崖 安天崖

并且本来显示的用户和组里,点击添加,一直在加载中,并不能添加


azunia

博主能不能补下前台发布文章的教程呢?

MODELS:

class Post(models.Model): 

 title = models.CharField(max_length=70, verbose_name='题目') 

 body = models.TextField(verbose_name='正文') 

 created_time = models.DateTimeField(auto_now_add=True) 

 modified_time = models.DateTimeField(auto_now_add=True) 

 excerpt = models.CharField(max_length=200, blank=True) 

 category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='分类') 

 tags = models.ManyToManyField(Tag, blank=True, verbose_name='标签') 

 author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 

 views = models.PositiveIntegerField(default=0)

...

VIEWS:

def ask(request): 

 if request.method == 'POST': 

 form = AskForm(request.POST, instance=request.user)

 if form.is_valid(): 

 form.save() 

 return redirect('/in')

...

FORMS:

class AskForm(forms.ModelForm): 

 class Meta: model = Post 

 fields = ['title', 'category', 'tags', 'body']


我写的前台view,获取当前登陆用户,然后保存文章到数据库

但是现在提交不报错,也跳转了,但是就是存不到数据库里。。


追梦人物 [博主] azunia

可以在调试环境下看看 form.save() 是否的确执行了。


azunia 追梦人物 [博主]

我测试改了一下:

VIEWS:

if request.method == 'POST': 

 form = AskForm(request.POST)

 if form.is_valid():

 form.save() 

 return redirect('/in')

去掉了request.user

然后

FORMS:

class AskForm(forms.ModelForm): 

 class Meta: model = Post 

 fields = ['title', 'author', 'category', 'tags', 'body']

加上了author

页面渲染出了所有用户的下拉列表。。但是这样提交之后,就能插入数据库了。。

我怎么能只能选当前用户,或者不显示,默认就是当前用户呢。。

愁人。。。。


追梦人物 [博主] azunia

哦,如果你用 model form,需要复写表单的 save 方法,手动将 user 保存,需要一定的技巧,最好是读一读表单的源码。


xiaopanddxiong

初学者的福利