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

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),

注意:

  1. 动态生成url

  2. 注册和生成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
models,py

同步数据库

# 项目路径下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

 

posted @ 2019-06-21 22:05  ryxiong728  阅读(585)  评论(0编辑  收藏  举报