您的位置:首页 > 编程语言 > Go语言

Django学习笔记2 【自定义你的admin】

2018-02-11 13:15 645 查看

一.概述

本章内容为根据自己课设项目所需要的后台管理部分进行各种配置,所设置的admin配置知识在django官网中的1.11文档部分均可找到,写这篇的目的是为了优化django admin的使用。

环境说明:

Django:1.11

python版本:3.4.4

操作系统:win10_1709_pro

二.表结构

数据库的表结构非常简单如下

bikedata表:

+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| bikeIp | varchar(50) | NO   |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+


bikelocation表:

+---------------+---------+------+-----+---------+----------------+
| Field         | Type    | Null | Key | Default | Extra          |
+---------------+---------+------+-----+---------+----------------+
| id            | int(11) | NO   | PRI | NULL    | auto_increment |
| bikeLongitude | double  | NO   |     | NULL    |                |
| bikeLatitude  | double  | NO   |     | NULL    |                |
| bikeId_id     | int(11) | NO   | MUL | NULL    |                |
+---------------+---------+------+-----+---------+----------------+


其中bikelocation表中的bikeID_id字段引用了bikedata表为外键

三.一步一步优化你的admin

1.数据库内表项无法区分



我在bikelocation数据库中添加了两行数据然而在admin中打开会发现我没有直接的办法区别他们,只能点击进去后才可以分辨,这是很不合理的,看了下他们显示的字符正好与类bikeLocation的实例输出后的结果是一致的,想到这里问题就简单了,将model的类中添加一个str方法即可。

修改后的model如下:

class bikeData(models.Model):
bikeIp = models.CharField(max_length=50)

def __str__(self):
str(return self.bikeIp)

class bikeLocation(models.Model):
bikeId = models.ForeignKey(bikeData)
bikeLongitude = models.FloatField()
bikeLatitude = models.FloatField()

def __str__(self):
return str(self.bikeId)


修改后的admin显示如下:



从原理上讲,我们是重写了model中的
__str__
方法使得当使用model对象的输出属性时候,不是输出默认的
xxx object
,而是我们重写的方法中所定制返回的东西,后面会有一些更方便的admin设置来让这里的显示更丰富。

现在我们可以基本区分数据库中每一行了,当我们想添加更多数据在每一行上时我们直接修改
__str__
方法即可。现在我们引入一种新的方法,使用admin配置文件。

首先在你的某个app目录下创建admin.py文件,下面展示了admin.py的一个基本模板

from django.contrib import admin
from main_site.models import bikeData, bikeLocation

# Register your models here.
@admin.register(bikeData)
class bikeDataAdmin(admin.ModelAdmin):
list_display = ('bikeIp',)

@admin.register(bikeLocation)
class bikeLocationAdmin(admin.ModelAdmin):
list_display = ('bikeId', 'bikeLongitude', 'bikeLatitude')  # 将表项以表格的形式展示出来,传递的参数是每一行中显示的列

# admin.site.register(bikeData, bikeDataAdmin)
# admin.site.register(bikeLocation, bikeLocationAdmin)


创建的类继承了admin.ModelAdmin后就可以对相应的admin文件进行修改了,为了具体到是对哪个model的页面,我们还要对相应的类进行注册,方法有两种,一种是装饰器。

这里使用了list_display属性,我们直接看使用效果



根据显示的结果,我们知道,只要在list_display中注册过的列都会在admin中显示,直接覆盖了刚才修改的
__str__
方法。

2.在list_display基础上继续优化

这样修改过的admin在显示上已经比一开始的好很多了,现在我们希望添加一些花样,细心的朋友发现上一张截图中,BIKEID这一列的表项是蓝色的,为蓝色的这样一列可以点击从而进入修改界面。我们如果想让其他列为蓝色,只要使用
list_display_links
即可

@admin.register(bikeLocation)
class bikeLocationAdmin(admin.ModelAdmin):
list_display = ('bikeId', 'bikeLongitude', 'bikeLatitude')  # 将表项以表格的形式展示出来,传递的参数是每一行中显示的列

list_display_links = ('bikeLongitude','bikeLatitude')  # 选择"list_display"哪个项目可以点击进入修改界面,默认是第一个索引




修改后后两列变成蓝色,点击即可进入修改界面。

这一列我们改了半天只是修改了相应的显示,我们现在想进行编辑可以吗,当然可以admin配置文件提供
list_editable
来进行对一行中某列的修改,但是这个方法中所注册的列不能在
list_display_link
中出现过

@admin.register(bikeLocation)
class bikeLocationAdmin(admin.ModelAdmin):
list_display = ('bikeId', 'bikeLongitude', 'bikeLatitude')  # 将表项以表格的形式展示出来,传递的参数是每一行中显示的列
list_display_links = ('bikeId',)  # 选择"list_display"哪个项目可以点击进入修改界面,默认是第一个索引
list_editable = (
'bikeLongitude', 'bikeLatitude',)  # 可以直接在表项的目录中对数据进行修改,注意的是,某列不能同时出现在list_display_link与link_editable同时出现


结果如下



直接在这个界面就可以进行修改,十分方便

3.开始配置修改界面

我们先通过模板界面的蓝色处点击进入未配置过的修改界面



首先依旧是对显示的修改,默认情况下,我们可以在修改界面中修改每一行的所有列,使用
fields
属性即可自定义修改界面中可以显示的列

@admin.register(bikeLocation)
class bikeLocationAdmin(admin.ModelAdmin):
list_display = ('bikeId', 'bikeLongitude', 'bikeLatitude')  # 将表项以表格的形式展示出来,传递的参数是每一行中显示的列
list_display_links = ('bikeId',)  # 选择"list_display"哪个项目可以点击进入修改界面,默认是第一个索引
list_editable = (
'bikeLongitude', 'bikeLatitude',)  # 可以直接在表项的目录中对数据进行修改,注意的是,某列不能同时出现在list_display_lists与link_editable同时出现
fields = ('bikeLongitude', 'bikeLatitude', )


我们这样修改后现在这可以修改两个列



fields
中还有一些小技巧,比如我们想让BikeLongituude和BikeLatitude列在一行中显示我们直接将这两个放在一个额外元组中即可

fields = (('bikeLongitude', 'bikeLatitude', ),)




4.其他修改

list_display_links = None


如果该项为
None
那么我们也就无法进入修改界面了



如上图所示,没有蓝色的项

actions_selection_counter = False




这个选项用来屏蔽图中黄色的部分,如果为False也就不显示多少个中几个被选中



actions_on_bottom = True

actions_on_top = False


这两个选项可以改变动作菜单的位置,默认是只有一个在上面,如果两个都为True那么就是上下各有一个动作菜单,如下。



5.django admin的汉化



修改setting配置文件中的LANGUAGE_CODE字段就可以进行汉化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Django