要渲染完整的网页, 除了服务器生成的HTML以外, 还需要其他一些文件, 如图像, JavaScript, CSS. 在Django称这些文件为静态文件.
django.contrib.staticfiles就是从各个app中收集静态文件, 集中在一起便于使用.
1. 定制化App的外观
a, polls下创建static文件夹
b. static文件夹下创建polls文件夹
这一步的目的与templates中一样, 方便告诉django是哪个app下的static文件, 以免引用了其他app下同名的static文件.
c. 刚创建的polls文件夹下创建style.css文件
d.在style.css中写以下代码:
li a {
color: green;
}
e. 在polls/templates/polls/index.html中写代码:
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />
f. 打开浏览器,输入polls主页验证
链接字体已变成绿色.
2. 增加背景图片
a. 创建polls/static/polls/image文件夹
b. 放置一个名为background.gif的图片到该文件夹中.
c. 编辑polls/static/polls/style.css
body {
background: white url("images/background.gif") no-repeat right bottom;
}
d.打开polls主页验证
发现如果用chrome浏览器, 不显示背景图片.查看源代码时, 发现css文件中没有body{}内容.
如果用IE浏览器, 是可以显示背景图片的.
3.定制admin的question和choice页面
a.改变键值显示顺序
改写polls/admin.py代码
改写前:
from django.contrib import admin
from .models import Question
admin.site.register(Question)
改写后:
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin)
遵循这样一种套路: 创建一个model admin的类, 当你需要改变该model的admin options时, 将model admin类作为第二个参数传给admin.site.register().
打开admin页面可以看到, 上述的改变会导致pub_date出现在question_text键值之前, 跟以前顺序相反.
b. 把键值分组
当表格中有很多键值时, 可能想要给键值分成不同集合.
改写polls/admin.py:
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
打开浏览器的admin页面验证
c. 显示question下的choices.
修改polls/admin.py代码:
from .models import Question, Choice # 新增import Choice
# ......
admin.site.register(Choice)
打开admin页面验证:
点击Choices右侧的+Add按钮出现以下页面:
Question右侧的下拉列表, 里面显示了所有Question, 之所以有这个下拉列表, 是Django根据Choice表格有一个外键.
在Question下拉窗口右侧还有一个 "+" 按钮, 鼠标移动过去的时候显示"Add another question", 按下后弹出一个增加问题的表格.
如果输入内容并按下save按钮, 则django将增加一个问题到数据库中,并动态显示在question下拉菜单中.但这不是一个高效的增加Choice对象的方法, 高效的方法是在新建Question时直接建立多个Choice.
d. 修改polls/admin.py代码:
这些代码告诉django, choice对象可以在question admin页面中得到编辑. 默认有三个choice的键.
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
出现三个空选项是由extra指定的, 如果点击进入一个已创建选项的question时, 会额外增加3个空选项slot.
点击增加按钮之后, 新增一个空choice, 右侧显示一个关闭按钮.
e. 让Question版面更紧凑
在question页面下方显示三四个空choice, 占版面太多了, 可以改为表格显示方式.
修改polls/admin.py代码:
class ChoiceInline(admin.TabularInline):
修改后页面变得紧凑
4. 定制admin change list页面
change list页面原来是这样的
django默认只显示每个对象的str(), 现在我们想要把各个键显示出来
a. 修改polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
# ......
list_display = ('question_text', 'pub_date', 'was_published_recently')
打开页面验证
点击各列表头, 可以进行排序, 但was published recently这一列不行, 因django不支持对随意定义的方法的输出进行排序.
was published recently这个列表头也是以该方法名字来命名的, 该列显示的键值是以文本格式显示的.
为了改善以上三个问题, 改善代码来解决.
b. 改善自定义方法输出结果的显示方式.
修改polls/models.py代码, 为was_published_recently方法增加一些参数
class Question(models.Model):
# ......
def was_published_recently(self):
return timezone.now() >= self.pub_date >= timezone.now() - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
修改后页面:
c. 为change list增加一个filter sidebar
在polls/admin.py修改代码:
class QuestionAdmin(admin.ModelAdmin):
# ......
list_filter = ['pub_date']
修改后页面:
d. 增加搜索栏
在polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
# ......
search_fields = ['question_text']
类似地, 还可以定制诸如Change list pagination,search boxes, filters, date-hierarchies,column-header-ordering这些参数.
5. 定制admin的外观
a. 新建项目下的templates目录
在项目主目录下新建一个templates目录, 实际上, 本项目已经存在这样一个文件夹.
b.mysite/setting下增加DIRS选项.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 新增该句
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DIRS是在django启动templates时, 会搜索的文件系统路径.
c.在templates文件夹中新建admin文件夹
并从django默认的templates文件夹中(django/contrib/admin/templates)将admin/base_site.html复制到新建的文件夹中
如果找不到django安装的目录, 则可以在cmd环境中用以下方法查找
d. 定制admin templates中显示字眼
变更前:
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}
变更后:
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Admin</a></h1>
{% endblock %}
页面样子:
其他django默认的templates都是可以通过这种方法改写的.