Django组件--admin

admin组件的使用

Django 提供了基于 web 的管理工具,为每一个app下的每一个model表进行增删改查。

Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中INSTALLED_APPS 看到它

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "app01"
]

django.contrib是一套庞大的功能集,它是Django基本代码的组成部分。

激活管理工具

通常我们在生成项目时会在 urls.py 中自动设置好,

from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),

]

当这一切都配置好后,Django 管理工具就可以运行了。

使用管理工具

启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,得到登陆界面(需要进行数据库迁移,才能登陆和注册超级用户),你可以通过命令 python manage.py createsuperuser 来创建超级用户。

为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型到 admin

from app01 import models
admin.site.register(models.UserInfo)

但是,这种方式比较简单,如果想要进行更多的定制操作,需要利用ModelAdmin进行操作,如:

# 方式一,重写样式类,默认样式类admin.ModelAdmin,可以通过继承来修改参数
from django.contrib import admin

class A(admin.ModelAdmin):
    list_display=["id","name","email"]

admin.site.register(UserInfo,A)  # 第一个参数可以是模型类的列表

方式二:
@admin.register(models.UserInfo)                # 第一个参数可以是列表
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd',)
admin.ModelAdmin样式类中的一些参数
1 list_display,列表时,定制显示的列,现实的列不可以是多对多的值(多个值)。
class A(admin.ModelAdmin):
    list_display=["id","name","email"]

2 list_display_links,列表时,定制列可以点击跳转。

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    list_display_links = ('name',"email")

3. list_filter,列表时,定制右侧筛选框的内容。

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    list_filter=["roles"]  # 将人以角色分组,右侧菜单显示全部组

4. list_select_related,列表时,连表查询是否自动select_related

5. list_editable,列表时,可以编辑的列(编辑的列不可以是跳转的列)

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    list_editable=['name']  # 可以直接在列表页修改和保存,不必进入详细页

6. search_fields,列表时,模糊搜索的功能

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    search_fields=["name","email"]  # 提供模糊搜索的列,可以对这些列进行模糊搜索

7. date_hierarchy,列表时,对Date和DateTime类型进行搜索

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    date_hierarchy = 'time' # 传入一个时间字段名,列表左上角会有一个时间的归档

8  inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除


class UserInfoInline(admin.StackedInline): # TabularInline
    extra = 0
    model = models.UserInfo
 
 
class GroupAdminMode(admin.ModelAdmin):
    list_display = ('id', 'title',)
    inlines = [UserInfoInline, ]

9 action,列表时,定制action中的操作

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    def foo(self, request, queryset):  # queryset是选中元素的对象
        pass

    foo.short_description = "中文显示自定义Actions"  # 批量操作的名称
    actions = [foo,]  # 传递函数列表
  
    # Action选项都是在页面上方显示
    actions_on_top = True
    # Action选项都是在页面下方显示
    actions_on_bottom = False
 
    # 是否显示选择个数
    actions_selection_counter = True

10 定制HTML模板

add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None

11 raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式,而不再是select框

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    raw_id_fields = ('roles',)

12  fields,详细页面时,显示字段的字段

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    fields=["name"]

13 exclude,详细页面时,排除的字段

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    exclude=["name"]

14  readonly_fields,详细页面时,只读字段

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    readonly_fields=["name"]

15 fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]

    fieldsets = (
        # 将内容分组
        ('AAAA', {  # 这个键是组名
            'fields': ('name', 'email')   # 这里的值是组中的字段
        }),

        ('其他', {
            'classes': ('collapse', 'wide', 'extrapretty'), # 设置样式类
            'fields': ('roles',),
        }),
    )    

16 详细页面时,M2M显示时,数据移动选择(方向:上下和左右)

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    date_hierarchy = 'time'
    filter_vertical = ("roles",)  # 多对多时设置两个框,将要设置的内容移到框里
    # 或者filter_horizontal = ("roles",)

17 ordering,列表时,数据排序规则

class UserInfoConfig(admin.ModelAdmin):
    list_display = ["id", "name", "email"]
    ordering = ('-id',)
    或
    def get_ordering(self, request):
        return ['-id', ]

18. radio_fields,详细页面时,使用radio显示选项(FK默认使用select)

radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL

19 form = ModelForm,用于定制用户请求时候表单验证 --过

20 empty_value_display = "列数据为空时,显示默认值"

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    empty_value_display = "列数据为空时,默认显示"
 
    list_display = ('user','pwd','up')
 
    def up(self,obj):
        return obj.user
    up.empty_value_display = "指定列数据为空时,默认显示"

Admin源码解析

 admin实现流程

一 注册

1 当django项目启动时,admin应用首先扫描(加载)每一个app下面的admin.py文件

2 (1)from django.contrib import admin

  加载admin -->sites---->site = AdminSite() (单例对象)

 (2)每一个admin.py中
  admin.site.register(Book)

class AdminSite(): 
			
		def __init__(self, name='admin'):
			self._registry = {} 
			 
		def register(self, model, admin_class=None,):  # 注册的方法,接收一个模型类和一个样式类
			if not admin_class:  # 如果没有传递样式类就是用默认的样式类
				admin_class = ModelAdmin
						
					
			 self._registry[model] = admin_class(model, self) # 将数据存储在self._registry中,模型类为键,该模型的样式类实例为值

 二 生成url

根据类名和项目名生成url,再分发功能.

根据模型类获取项目名和类名

models._meta.app_label  # app名字
models._meta.model_name  # 小写类名

 

django中部分代码

class AdminSite(object):  
 def get_urls(self):
        from django.conf.urls import url, include
        from django.contrib.contenttypes import views as contenttype_views
        urlpatterns = [
           # 关于登录的url
        ]

        valid_app_labels = []
        for model, model_admin in self._registry.items():
        # self._registry存储这已注册模型类与该类样式类的实例
            urlpatterns += [
                url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),分发给该样式类实例
            ]
        return urlpatterns
    @property
        def urls(self):
            return self.get_urls(), 'admin', self.name

 

样式类中的urls

class ModelAdmin(BaseModelAdmin):
    def get_urls(self):
        from django.conf.urls import url
        info = self.model._meta.app_label, self.model._meta.model_name

        urlpatterns = [
           url("正则",处理的函数,name),
           ...
        ]
        return urlpatterns

    @property
    def urls(self):
        return self.get_urls()    

  

 

posted @ 2018-03-09 16:23  瓜田月夜  阅读(95)  评论(0编辑  收藏  举报