10 - Django应用第七步
1 自定义管理表单
通过在admin.py注册之后可以在后台中管理相应注册的表
但是我们还学要更多的自定义操作
polls/admin.py
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 class)
- 添加到admin.site.register() 中
根据这样的更改, 发布日期出现在了问题题目的上面
然而这样的修改还是不足够, 需要进一步定制
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)
此时修改完毕
2 添加相关对象
刚才的问题还关联了它的选项, 但是在后台并没有展示
方法一: 将Choice添加到后台管理
polls/admin.py
from django.contrib import admin
from .models import Question, Choice class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
] admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
此方法的问题是, 这样问题和选项就相互独立了, 这样他们之间的关联性体现就不强了, 操作也不方便
虽然在Choice管理的时候可以通过下拉菜单的方式获得Question, 还可以点击加号添加
方法二: 自定义Question在后台的显示
polls/admin.py
from django.contrib import admin
from .models import Choice, Question 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] admin.site.register(Question, QuestionAdmin)
可以看到
可以看到, 多出来3个空白的选项, 这是
extra = 3
产生的效果
但是这样的选项占地面积太大, 能不能小一点呢
polls/admin.py
# class ChoiceInline(admin.StackedInline):
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 3
效果为
注意多出来了一个delete?列
3 自定义修改列表
对于这样的列表显得有些信息量不足, 在这大片的列表信息中, 仅仅只显示了Question的标题
让我们添加一些内容显示得更加丰满
此时我们需要使用 list_display , 这是一个元组, 元组类就是列表显示的各列
class QuestionAdmin(admin.ModelAdmin):
# 原有代码
list_display = ('question_text', 'pub_date', 'was_published_recently')
现在显示的结果为
后台管理的功能十分强大, 点击标题可以进行排序
但是我们自定义的方法不能被排序(不支持任意方法的输出结果排序)
而且为了更加美观, 原有的方法名中间的下划线用空格替代了
自定义方法的列的值是函数返回值的字符串表示形式
为此我们做一点修改
polls/models.py
class Question(models.Model):
# 原有代码不变
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
# 新增代码
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
(然而似乎新增的三个属性已经不生效了 (;´д`)ゞ)
另外还可以添加一个时间过滤器, 一个搜索框到QuestionAdmin
polls/admin.py
list_filter = ['pub_date']
search_fields = ['question_text']
4 自定义后台样式
4.1 自定义项目模板
事实上, 模板文件可以存放在任何只要是Django项目可以访问到的地方, 但是按照管理, 也是为了规范和管理, 一般放到项目文件夹下
在mysite/settings.py中添加DIRS
mysite/settings.py
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加载模板的目录
查询Django资源文件路径
python -c "import django; print(django.__path__)"
本地的资源路径为
C:\Python36\Lib\site-packages\django
并复制文件
C:\Python36\Lib\site-packages\django\contrib\admin\templates\admin\base_site.html
在templates创建admin文件夹, 并将该文件复制到该文件夹中
修改
部分为本地的名字, 这就是后台的左上角展示的内容, 可以更改为
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}
结果为
根据这个经验我们可以知道, 同样的方法, 只要覆盖admin的文件, 都可以进行自定义修改
4.2 自定义应用模板
如果DIR设置为空, Django会查看APP_DIRS, 如果它设置为True, 那么此时Django就会在应用程序目录下查找templates目录
现在我们的应用并不复杂, 但是如果后来应用越写越大, 那么此时管理该应用的后台模板的修改就是必要的了
但是此时不应该修改项目的模板而是该应用的模板
这样不仅更贱具有针对性, 也是的我们做好的应用能够移植的更好
5 定制后台首页
默认情况下, 首页会根据INTALLED_APPS中的应用的字母顺序显示应用
具体如果需要定制首页, 那么需要修改的首页为
C:\Python36\Lib\site-packages\django\contrib\admin\templates\admin\index.html
其中的特殊变量app_list就是所有应用的列表
10 - Django应用第七步的更多相关文章
- [学习笔记] 七步从AngularJS菜鸟到专家(6):服务 [转]
这是"AngularJS – 七步从菜鸟到专家"系列的第六篇. 在第一篇,我们展示了如何开始搭建一个AngularaJS应用.在第五篇我们讨论了Angular内建的directives.在这一章,我们 ...
- [学习笔记] 七步从AngularJS菜鸟到专家(4和5):指令和表达式 [转]
这一篇包含了"AngularJS - 七步从菜鸟到专家"系列的第四篇(指令)和第五篇(表达式). 之前的几篇展示了我们应用的核心组件,以及如何设置搭建一个Angular.js应用.在这一部分,我们会厘 ...
- [学习笔记] 七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX [转]
这是"AngularJS - 七步从菜鸟到专家"系列的第三篇. 在第一篇,我们展示了如何开始搭建一个AngularaJS应用.第二篇我们讨论了scope和 $scope 的功能. 通过这整个系列的教程 ...
- 七步精通Python机器学习--转载
作者简介: Matthew Mayo 翻译:王鹏宇 开始.这是最容易令人丧失斗志的两个字.迈出第一步通常最艰难.当可以选择的方向太多时,就更让人两腿发软了. 从哪里开始? 本文旨在通过七个步骤, ...
- Django项目使用七牛云存储图片
Django项目使用七牛云存储图片 最近,写了一个django项目,想在项目中使用七牛云存储上传图片,在网上搜索到django-qiniu-storage,查看文档,按步骤居然设置成功了. 安装 1 ...
- django学习-10.django连接mysql数据库和创建数据表
1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...
- 《Pro Express.js》学习笔记——Express服务启动常规七步
Express服务启动常规七步 1. 引用模块 var express=require('express'), compression=require('compression'), bo ...
- 七步,搭建基于Windows平台完美Jekyll博客环境
最近,基于Jekyll新搭建了自己英文博客.整个过程搜索了不少资料,也尝试和过滤了不少工具和插件,最后的效果还是不错的.这里总结一下主要的七个步骤,感兴趣的朋友可以参考一下: 第一步,安装Ruby开发 ...
- APP设计师拿到APP产品原型开始,七步搞定APP设计(转)
任何一款成功的APP都需要以坚实的产品概念作为基础,因为概念决定了产品最终完成的潜力. 一般情况下,交到app设计师手里的都是移动app产品原型图.当然这个是在移动产品经理反复斟酌,并且与大家开会讨论 ...
随机推荐
- Cross Frame Script (跨框架脚本) 攻击
一.Cross Frame Script (跨框架脚本) 攻击 什么是Cross Frame Script? 很简单,做个实验就知道了.把下面的这段HTML代码另存为一个html文件,然后用ie浏览器 ...
- web安全之SQL注入---第三章 如何寻找sql注入?
借助逻辑推理1.识别web应用中所有输入点2.了解哪些类型的请求会触发异常3.检测服务器响应中的异常 总结: 输入点无非就是:地址栏.和输入框 输入康输入一些非法字符,导致后台的sql语句错误,
- Java水印图片处理
今天需要用Java程序给图片加水印,于是在网上找到了一段代码,感觉很好,于是记录了下来,原来的网址给忘了: import java.awt.AlphaComposite; import java.aw ...
- HTML使用post方式提交中文内容出现乱码的错误解决方式
今天在做一个例子的时候,使用post方式提交表单,如果有中文的话,在另一个页面显示出来的时候,总是会出现乱码: 但是将提交方式改为get的时候,就不会出现这种错误. 详细错误见下面图片和代码. HTM ...
- js的new到底干了啥 -
javascript通过new操作符构建一个对象的步骤 <Javascript高级程序设计>的解释: 创建一个对象 将构造函数的作用域赋给新对象(把新对象作为构造函数的调用上下文,也就是t ...
- 九度OJ 1185:特殊排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15588 解决:3592 题目描述: 输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序. 输入: 输入第一行包括1个整数N,1< ...
- 阿里云服务(一) OSS
阿里电子商务迄今是中国最大的电商网站,各个厂商都在去模仿.就像google的大数据处理,Hadoop的思想等等,只有做出了一些成绩,起了带头羊,那么将会是非常吃香的.从今天开始简单学习了解一下阿里的各 ...
- Android UI Design
Ref:直接拿来用!10款实用Android UI工具 Ref:Android UI设计资源 Ref:Android酷炫实用的开源框架(UI框架) Ref:Android UI 组件 Ref:Andr ...
- Linux基础系列:常用命令(5)_samba服务与nginx服务
作业一:部署samba 每个用户有自己的目录,可以浏览内容,也可以删除 所有的用户共享一个目录,只能浏览内容,不能删 安装samba服务 1.准备环境 setenforce 0 2.安装软件包 yum ...
- (转载)DataTable与List<T>相互转换
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...