Django框架—admin详细使用
class Base(object): # 定义类Base
def __init__(self,val):
self.val = val
def func(self):
self.test()
print(self.val)
def test(self):
print("Base.test")
class Foo(Base): # 定义类Foo
def test(self):
print("FOO.test")
# def func(self):
# print(self.val,666)
# 有就执行自己的,没有就执行父类的
class Bar(object):
def __init__(self):
self._register = {}
def register(self,a,b=None):
if not b:
b=Base
self._register[a] = b(a) #函数,类,对象
obj = Bar() #实例化就会去执行它自己的__init__方法,并获取到一个对象b,b就可以调用里面的属性和方法了
obj.register(1,Foo) # _register属性中存的是1:Foo类,且Foo.val=1
obj.register(2) # 又增加了一个2:Base类的实例,且Base.val=2
print(obj._register) # {1: <__main__.Foo object at 0x0000000002213160>, 2: <__main__.Base object at 0x0000000002213198>}
# obj._register[1] == Foo(1)
obj._register[1].func() # Foo的对象 打印结果:FOO.test 1
obj._register[2].func() # Base的对象 打印结果:Base.test 2
2.单例模式
单例模式是一个设计模式(说白了就是单个实例公用一个对象)
举例一
s1.py
class Foo(object):
def test(self):
print("123")
v = Foo()
# v是Foo的实例
s2.py
from s1 import v as v1 print(v1,id(v1)) # <s1.Foo object at 0x0000000002221710> 35788560 from s1 import v as v2 print(v1,id(v2)) # <s1.Foo object at 0x0000000002221710> 35788560 # 两个的内存地址是一样的
注意:文件加载的时候,第一次导入后,再次导入时不会再重新加载。
举例二
class Singleton:
def __new__(cls, *args, **kw):
'''__new__是一个构造方法,self就是他构造的'''
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
one = Singleton()
two = Singleton()
print(one,two) # 他们两个的地址一样
# print(id(one),id(two))
one.name = 'alex'
print(two.name)
二、django-admin的简单回顾
1.admin使用流程
models.py
-
创建表模型
admin.py
-
注册表 admin.site.register(models.UserInfo)
urls.py
url(r'^admin/', admin.site.urls),
注意:
-
动态生成url
-
注册和生成url使用的都是admin.site
2.路由系统
一个路径对应一个视图
url(r'^index/$', views.index,name="index1"), url(r'^index/(\d+)$', views.index,name="index2"), url(r'^blog/', include('blog.urls'))
有name的说明是反向解析,两种方式
代码中:
reverse('index1') reverse('index2',args=(666,))
模板中:
{% url 'index1' %}
{% url 'index2' 666 %}
3.文件加载
第一次导入后,再次导入时不再重新加载
4.面向对象
-
封装
-
继承
三、django-admin的具体使用
https://www.cnblogs.com/wumingxiaoyao/p/6928297.html
首先需要发现的,当我们创建登录admin的时候,里面会有增删改查,但是admin的功能远不止这些,我们可以通过以下方式设置admin的表样式,以及扩展admin的功能。
1.数据表的准备
新建admin学习项目,应用admin_lesson,models文件中
from django.db import models class UserInfo(models.Model): name = models.CharField(max_length=32,verbose_name="用户名") email = models.EmailField(max_length=32,verbose_name="邮箱") ut = models.ForeignKey(to="UserType",verbose_name="所属类型") def __str__(self): return self.name class UserType(models.Model): caption = models.CharField(max_length=32,verbose_name="用户类型名称") roles = models.ManyToManyField(to="Role",verbose_name="所属角色") def __str__(self): return self.caption class Role(models.Model): name = models.CharField(max_length=32,verbose_name="角色名") def __str__(self): return self.name
同步数据库
# 项目路径下cmd中 python manage.py makemigrations python manage.py migrate python manage.py createsuperuser # 创建控制admin的用户,只需要填用户名密码,邮箱可以忽略
或者使用django的自带环境,可以省略python admin
2.配置路由
项目路径下
urlpatterns = [ url(r'^admin/', admin.site.urls), ]
admin路由可以创建一些路由映射关系
/admin/ /admin/login/ /admin/logout/ /admin/password_change/ /admin/password_change/done/ /admin/app名称/model名称/ /admin/app名称/model名称/add/ /admin/app名称/model名称/ID值/history/ /admin/app名称/model名称/ID值/change/ /admin/app名称/model名称/ID值/delete/
实例
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^admin/admin_lesson/userinfo/1/change', admin.site.urls), # 配置修改userinfo表id为1的记录路径 ]
3.应用注册
普通注册方法
admin.site.register(models.UserInfo) admin.site.register(models.Role) admin.site.register(models.UserType)
这种注册方法,可以在admin中对表进行增删改查的基本功能,但是如果我们需要在admin中实现更多个性化的功能定制,就需要利用ModelAdmin操作。
自定义注册应用
若要把app应用显示在后台管理中,需要在admin.py中注册。这个注册有两种方式,个人比较喜欢用装饰器的方式。
-
方式1
from django.contrib import admin
from admin_lesson.models import UserInfo
# Userinfo模型的管理器
class UserInfoAdmin(admin.ModelAdmin):
list_display=('id', 'name', 'email', 'ut')
# 在admin中注册绑定
admin.site.register(UserInfo, UserInfoAdmin)
上面方法是将管理器和注册语句分开。有时容易忘记写注册语句,或者模型很多,不容易对应。
-
方式2
from django.contrib import admin
from admin_lesson.models import UserInfo
#Blog模型的管理器
@admin.register(Userinfo)
class UserInfoAdmin(admin.ModelAdmin):
list_display=('id', 'name', 'email', 'ut')
该方式比较方便明显,推荐用这种方式。
4.admin界面汉化
默认admin后台管理界面是英文的,对英语盲来说用起来不方便。可以在settings.py中设置改为:
LANGUAGE_CODE = 'zh-CN' TIME_ZONE = 'Asia/Shanghai'
1.8版本之后的language code设置不同:
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
注意注释掉原有设置

5.记录列表基本设置
1.list_display
列表显示时,定制显示的列。
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'email', 'ut', 'show')
def show(self, obj): # 定义一个函数显示的字段
return "1234"
2.list_display_links
列表显示时,定制列可以点击跳转到详细记录进行修改。
class UserInfoAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'email', 'ut', 'show')
list_display_links = ('name',)
def show(self, obj): # 定义一个函数显示的字段
return "1234"

3.list_filter
定制右侧快速筛选。
class UserInfoAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'email', 'ut', 'show')
list_display_links = ('name',)
def show(self, obj):
return "1234"
class Ugg(admin.SimpleListFilter):
title = _("邮箱") # 显示已什么筛选
parameter_name = "show"
def lookups(self, request, model_admin):
"""
显示筛选选项
:param request:
:param model_admin:
:return:
"""
return models.UserInfo.objects.values_list('id', 'email')
def queryset(self, request, queryset):
"""
点击查询时,进行筛选
:param request:
:param queryset:
:return:
"""
val = self.value()
return queryset.filter(email=val)
list_filter = ("name",Ugg)

4.分页相关
# 分页,每页显示条数
list_per_page = 100
# 分页,显示全部(真实数据<该值时,才会有显示全部)
list_max_show_all = 200
# 分页插件
paginator = Paginator
5.search_field
模糊搜索的功能
search_fields = ["name","email"]
6.其他基本设置
# ordering设置默认排序字段,负号表示降序排序
ordering = ('-id',)
# list_editable 设置默认可编辑字段
list_editable = ['email', 'ut']
# fk_fields 设置显示外键字段
fk_fields = ('ut',)
7.date_hierarchy
列表时,对Date和DateTime类型进行搜索
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
date_hierarchy = 'ctime'
8.preserve_filters,
详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件
9.save_as = False
详细页面,按钮为“Sava as new” 或 “Sava and add another”
10.save_as_continue = True
点击保存并继续编辑
save_as_continue = True # 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。 # 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。
save_on_top = False,详细页面,在页面上方是否也显示保存删除等按钮
11.inlines
详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
class UserInfoInline(admin.StackedInline): # TabularInline
extra = 0
model = models.UserInfo
class GroupAdminMode(admin.ModelAdmin):
list_display = ('id', 'title',)
inlines = [UserInfoInline, ]
12.action
列表时,定制action中的操作
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
# 定制Action行为具体方法
def func(self, request, queryset):
print(self, request, queryset)
print(request.POST.getlist('_selected_action'))
func.short_description = "中文显示自定义Actions"
actions = [func, ]
# Action选项都是在页面上方显示
actions_on_top = True
# Action选项都是在页面下方显示
actions_on_bottom = False
# 是否显示选择个数
actions_selection_counter = True

浙公网安备 33010602011771号