django 强大的一个地方就是在于它集成了一个非常方便的admin后台,我们只需要做简单的配置就可以实现一些强大的功能。所以接下来我们介绍下admin后台的使用
model
简单model 先准备models.py文件 如下
from django.db import models # Create your models here. class User(models.Model):
GENDER = ((0, "未知"), (1, "男"), (2, "女"))
name = models.CharField('名字', max_length=256)
gender = models.IntegerField("性别", choices=GENDER, default=0)def __str__(self):
return self.nameclass Meta:
verbose_name = '用户'
db_table = 'user'
然后,我们可以根据model 准备admin.py的代码了,简单示例如下
from django.contrib import admin
from .models import * @admin.register(User)
class UserAdmin(admin.ModelAdmin):
pass
- 创建管理员账户
python manage.py createsuperuser
- 访问
/admin/
用创建的用户名密码登录,可以看到我们注册的model
from django.db import models # Create your models here. class Tag(models.Model):
name = models.CharField(max_length=20)class Meta:
verbose_name = "标签" class User(models.Model):
GENDER = ((0, "未知"), (1, "男"), (2, "女"))name = models.CharField('名字', max_length=256)
phone = models.CharField('手机', max_length=40, null=True)
gender = models.IntegerField("性别", choices=GENDER, default=0)tag = models.ForeignKey(Tag, verbose_name="标签", on_delete=models.CASCADE)def __str__(self):
return self.nameclass Meta:
verbose_name = '用户'
db_table = 'user' class Property(models.Model):
user = models.ForeignKey(User, verbose_name="用户", on_delete=models.CASCADE)
context = models.CharField('内容', max_length=200)def __str__(self):
return self.contextclass Meta:
verbose_name = "用户属性"
然后我们查看 admin页面,发现多了 标签选项
文章图片
现在对admin.py做一下添加
@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
pass
也就是仅仅将Tag model 注册到admin页面,在去观察admin页面,可以发现多了添加和修改按钮。
文章图片
接下来,我们添加
Property
model,按找Tag的方式注册完,发现并没有在User界面显示Property 相关的添加和查看,只能在Property中添加相应的用户,于是,我们引入inline,代码如下 class PropertyInline(admin.StackedInline):
model = Property @admin.register(User)
class UserAdmin(admin.ModelAdmin):
inlines = [PropertyInline, ]
pass
效果如下
文章图片
fileds 列表页 默认的列表页显示的是model的
__str__
值,我们可以自己定义,并添加多列的值来显示,也可以自己定义显示的内容等,具体内容看下面代码 from django.utils.safestring import mark_safe
@admin.register(User)
class UserAdmin(admin.ModelAdmin):# 列表页显示自定义字段
def url_test(self, obj):
# return '自定义的文字'
# 如果需要加上样式,或显示图片等,需要将字段标记成安全的,如下:
return mark_safe('url')
url_test.short_description = "链接测试"
list_per_page = 20 # 每页显示数量
list_display = ('id', 'name', 'phone''gender', 'url_test') # 列表页显示哪些列的数据,第一个字段会自动生成链接,指像该对象的详情页
list_editable = ('gender', ) # 在列表页可以编辑的字段
效果如下
文章图片
详情页 默认是显示所有的字段,我们也可以按照自己的需求添加和修改,代码如下
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
# 自定义显示字段的方式和列表页相同
# 只读字段,注意自定义显示的字段必须标记为readonly
readonly_fields = ('id', 'name', 'url_test')
# 要显示的字段顺序,可以分组显示
fields = (('id', 'name'), 'phone', 'gender', 'url_test' )
- 自定义表单
class ImageForm(ModelForm):
pic = FileField(required=False, label="图片")class Meta:
model = Image
fields = "__all__"@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_per_page = 20
form = ImageFormdef save_model(self, request, obj, form, change):
request.files = request.FILESpic = image_upload(request, "pic") # 上传图片至云,返回url
obj.pic = pic[0] if pic else obj.pic
return super().save_model(request, obj, form, change)
filter 当需要对列表页做筛选的时候,我们可以通过添加
list_filter
的字段实现,也可以自己定义相关的操作,代码如下 class CategoryFilter(admin.SimpleListFilter):
title = _('分类') # 显示的名字
parameter_name = 'category' # url中的字段def lookups(self, request, model_admin):
# url查找的值,和其对应的显示出来的值
return (
('80s', _('in the eighties')),
('90s', _('in the nineties')),
)def queryset(self, request, queryset):
# 我们自己处理的传过来的值的过程
if self.value():
id_ = int(self.value())
if id_:
return queryset.filter(category=id_)@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_filter = ('gender', CategoryFilter)
# 搜索字段的添加
search_fields = ("name", "phone")
其他操作 action 【python|django-admin】在界面上的这个位置,用来对列表页进行批量操作,默认了一个删除的action。
文章图片
- 编写自己的action
def send_note_msg(self, request, queryset):
error = ''
resoult = ''
for obj in queryset:
phone = obj.tel
txt = "短信内容 "
if sendMsg(phone, txt):
resoult += u'发送{}成功!'.format(obj.id)
obj.is_send_msg = True
obj.save()
else:
error += u'发送{}失败,相关信息不完整,mast need phone, event_name, delivery_num'.format(obj.id)
# 通知哪些发送成功,哪些发送失败
self.message_user(request, resoult, level=messages.SUCCESS)
self.message_user(request, error, level=messages.ERROR)# action显示的名称
send_note_msg.short_description = '发送短信提示'# 添加action
actions=[send_note_msg]
- 根据权限控制action的显示
def get_actions(self, request):
actions = super(GuestTmpAdmin, self).get_actions(request)
if 'guest.delete_guest' not in request.user.get_group_permissions():
del actions["send_note_msg"]
return actions
转载于:https://www.cnblogs.com/yuzhenjie/p/10395120.html
推荐阅读
- 人脸识别|【人脸识别系列】| 实现自动化妆
- 人工智能|干货!人体姿态估计与运动预测
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- 历史上的今天|【历史上的今天】2 月 16 日(世界上第一个 BBS 诞生;中国计算机教育开端;IBM 机器人赢得智能竞赛)
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索