文章目录
Django框架—admin详细使用
一、面向对象复习
1.类的继承
`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
# [Django框架—admin详细使用](https://www.cnblogs.com/ryxiong-blog/articles/11067035.html)
# 一、面向对象复习
## 1.类的继承
```python
`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)) ``# 35788560````from` `s1 ``import` `v as v2``print``(v1,``id``(v2)) ``# 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`
from
s1 ``import
v as v1``print``(v1,``id``(v1)) ``# 35788560````from
s1 ``import
v as v2``print``(v1,``id``(v2)) ``# 35788560````# 两个的内存地址是一样的
注意:文件加载的时候,第一次导入后,再次导入时不会再重新加载。
#### 举例二
```python
`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`