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