再完善一下管理后台
为了方便我们后面的开发,大狗又录了几条数据进去,喏~
然而,随着数据的录入,也暴露出管理后台的一些问题:
- 没有搜索功能,如果将来数据多了,查找需要操作的数据记录会是个问题
- 数据的录入时间显示错误(大家可以对比一下最后一条数据记录和截图右上角的系统时间),这应该是项目设置的时区错误导致的
- (妹纸说)管理后台的界面简直丑爆了
咳咳,那个...好吧,那我们就来改改看。
搜索和过滤
管理后台集成搜索功能,应该不会很难难,大狗觉得Django应该会提供相关的接口。下面我们就来为管理后台提供搜索功能,我们的计划是:
- 提供按照发布日期提供数据过滤的功能
- 提供按照文章题目查询的功能
我们打开blog目录下的admin.py文件,做如下的修改:
from django.contrib import admin
from blog.models import *
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'timestamp')
list_filter = ['timestamp'] //按添加日期过滤
search_fields = ['title'] //按文章题目搜索
admin.site.register(Article, ArticleAdmin)
我们把admin.py保存一下,然后在浏览器中刷新一下页面,呦吼~
我们先来试试按照发布日期过滤的功能。我们在后边的列表中点击“This month”,我们可以看到过滤后的数据:
我们点击“Any date”可重置发布日期过滤器。接下来,我们来试试按文章题目搜索的功能:
嗯,两行代码实现了两个在其它开发平台需要几十行甚至上百行才能搞定的功能。这就是Django的强大之处。
时区修正和中文化
接下来,我们需要解决市区问题。打开DjangoQuickTour目录下的settings.py文件,下面一行:
TIME_ZONE = 'UTC'
改成:
TIME_ZONE = 'Asia/Shanghai'
我们顺便也把管理后台的语言改成中文,方法就是把settings.py中的:
LANGUAGE_CODE = 'en-us'
改成:
LANGUAGE_CODE = 'zh-Hans'
刷新页面,然后再添加一条数据:
我们可以看到文章的发布时间已经和系统时间一致了,而且界面也变成中文了。
模型和应用信息的中文化
大狗还发现了一个问题,我们在项目中创建的类和属性在管理后台中都是直接显示其名称,在英文界面中还好,凡事在中文环境中显得十分的违和(“Article”是什么鬼?)所以,我们要为我们创建的模型类和属性加上中文名称。我们打开blog目录下的models.py,修改为如下的样子:
from __future__ import unicode_literals
from django.db import models
class Article(models.Model):
title = models.CharField(max_length = 100, verbose_name = '标题')
author = models.CharField(max_length = 30, verbose_name = '作者')
body = models.TextField(verbose_name = '内容')
timestamp = models.DateTimeField(verbose_name = '发布日期')
def __unicode__(self):
return self.title
class Meta:
verbose_name = '文章'
verbose_name_plural = '文章' //设置复数的显示,否则会出现“文章s”这种逆天的东东
然后保存文件后,开发服务器就报错了,“Non-ASCII character”,汪嘞个嗷的!查了下文档,发现是字符编码问题,在models.py最前面加了一行编码声明:
# encoding:utf-8
刷新界面后,问题解决了:
这样看上去就顺眼多了。
然而,还有一点小问题。模型类的名称和字段可以显示为中文,那么应用呢?“BLOG”是什么鬼?查过文档后,发现可以修改blog目录下的__init__.py,我们在其中输入下面的代码:
# encoding:utf-8
from os import path
from django.apps import AppConfig
VERBOSE_APP_NAME = '博客'
def get_current_app_name(file):
return path.dirname(file).replace('\\', '/').split('/')[-1]
class AppVerboseNameConfig(AppConfig):
name = get_current_app_name(__file__)
verbose_name = VERBOSE_APP_NAME
default_app_config = get_current_app_name(__file__) + '.__init__.AppVerboseNameConfig'
保存代码,在浏览器中刷新页面,然后... 就华丽丽的报错了!
Scheiße!忘记标示Unicode字符了!在'博客'前面加上一个字母“u”,再保存刷新,问题解决了。
集成Bootstrap框架
Bootstrap是由Twitter的设计师Mark Otto和Jacob Thornton合作开发的,基于 HTML、CSS、JAVASCRIPT的CSS/HTML框架,它简洁灵活,使得Web开发更加快捷,并提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,如果能把Bootstrap集成到我的博客里,效果一定不错。
那么怎么把Bootstrap集成到我的Django博客里呢?大狗一直相信一条真理,“大多数你想要实现的功能,都有人实现过,并且可以在GitHub上找到”。在GitHub上搜索了一下,居然找到一个项目:
https://github.com/django-admin-bootstrap/django-admin-bootstrap
按照提示,首先安装工具包,还是在命令行工具中运行:
pip install bootstrap-admin
然后,把“bootstrap_admin”添加到DjangoQuickTour目录下的settings.py中的“INSTALLED_APPS”配置节,并且确保其出现在“django.contrib.admin”之前,就像这样:
INSTALLED_APPS = [
'bootstrap_admin',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
然后,用下面的内容覆盖settings.py文件中的“TEMPLATES”配置节:
from django.conf import global_settings
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
# insert your TEMPLATE_DIRS here
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
# list if you haven't customized them:
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.request'
]
},
},
]
BOOTSTRAP_ADMIN_SIDEBAR_MENU = True
然后,保存代码,刷新浏览器中的后台管理页面。Look,是不是漂亮多啦?