Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有:

    依赖APP:
        django.contrib.auth
        django.contrib.contenttypes
        django.contrib.messages
        django.contrib.sessions

    模板的context_processors:
        django.contrib.auth.context_processors.auth
        django.contrib.messages.context_processors.messages

    中间件:
        django.contrib.auth.middleware.AuthenticationMiddleware
        django.contrib.messages.middleware.MessageMiddleware

一. 配置路由

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

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

当前配置的路由可以创建一些路由映射关系:

/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/

二. 定制Admin

在admin.py中只需要将Mode中的某个类注册,即可在Admin中实现增删改查的功能,如:

admin.site.register(models.UserInfo)

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

方式一:
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd',)

    admin.site.register(models.UserInfo, UserAdmin) # 第一个参数可以是列表

方式二:
    @admin.register(models.UserInfo)                # 第一个参数可以是列表
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd',)

ModelAdmin中提供了大量的可定制功能,如

1. list_display,列表时,定制显示的列。

from django.utils.safestring import mark_safe

@admin.register(UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'xxxxx','more')

    def xxxxx(self, obj):  # obj是userinfo对象
        return obj.name + '最帅'

    def more(self, obj):
        return mark_safe("<a href='www.shuaige%s.html'>点击查看写真</a>" % (obj.id,))

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

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'email', 'xxxxx')
    list_display_links = ('email',)

3. list_filter,列表时,定制右侧快速筛选。

@admin.register(UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'ut')
    list_filter = ['name', 'ut']

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

5. 分页相关

# 分页,每页显示条数
    list_per_page = 100

# 分页,显示全部(真实数据<该值时,才会有显示全部)
    list_max_show_all = 200

# 分页插件
    paginator = Paginator

6. list_editable,列表时,可以编辑的列

1
2
3
4
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user''pwd','ug',)
    list_editable = ('ug',)

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

1
2
3
4
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
     
    search_fields = ('user''pwd')

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

1
2
3
4
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    date_hierarchy = 'ctime'

9. preserve_filters,详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件

10. save_as = False,详细页面,按钮为“Sava as new” 或 “Sava and add another”

11. save_as_continue = True,点击保存并继续编辑

1
2
3
4
5
6
save_as_continue = True
 
# 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。
# 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。
 
New in Django 1.10.

12. save_on_top = False,详细页面,在页面上方是否也显示保存删除等按钮

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

1
2
3
4
5
6
7
8
class UserInfoInline(admin.StackedInline): # TabularInline
    extra = 0
    model = models.UserInfo
 
 
class GroupAdminMode(admin.ModelAdmin):
    list_display = ('id''title',)
    inlines = [UserInfoInline, ]

14. action,列表时,定制action中的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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

15. 定制HTML模板

1
2
3
4
5
6
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

16. raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式

1
2
3
4
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    raw_id_fields = ('FK字段''M2M字段',)

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

1
2
3
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    fields = ('user',)

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

1
2
3
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    exclude = ('user',)

19. readonly_fields,详细页面时,只读字段

1
2
3
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    readonly_fields = ('user',)

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

1
2
3
4
5
6
7
8
9
10
11
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    fieldsets = (
        ('基本数据', {
            'fields': ('user''pwd''ctime',)
        }),
        ('其他', {
            'classes': ('collapse''wide''extrapretty'),  # 'collapse','wide', 'extrapretty'
            'fields': ('user''pwd'),
        }),
    )

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

1
2
3
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)

22. ordering,列表时,数据排序规则

1
2
3
4
5
6
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    ordering = ('-id',)
    
    def get_ordering(self, request):
        return ['-id', ]

23. view_on_site,编辑时,是否在页面上显示view on set

1
2
3
4
view_on_site = False
def view_on_site(self, obj):
    return 'https://www.baidu.com'

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

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

25. show_full_result_count = True,列表时,模糊搜索后面显示的数据个数样式

1
2
3
4
5
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    # show_full_result_count = True # 1 result (12 total)
    # show_full_result_count = False  # 1 result (Show all)
    search_fields = ('user',)

26. formfield_overrides = {},详细页面时,指定现实插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.forms import widgets
from django.utils.html import format_html
 
class MyTextarea(widgets.Widget):
    def __init__(self, attrs=None):
        # Use slightly better defaults than HTML's 20x2 box
        default_attrs = {'cols''40''rows''10'}
        if attrs:
            default_attrs.update(attrs)
        super(MyTextarea, self).__init__(default_attrs)
 
    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        final_attrs = self.build_attrs(attrs, name=name)
        return format_html('<textarea {}>\r\n{}</textarea>',final_attrs, value)
 
 
 
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    formfield_overrides = {
        models.models.CharField: {'widget': MyTextarea},
    }

27. prepopulated_fields = {},添加页面,当在某字段填入值后,自动会将值填充到指定字段。

1
2
3
4
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {"email": ("user","pwd",)}

PS: DjangoAdmin中使用js实现功能,页面email字段的值会在输入:user、pwd时自动填充

28. form = ModelForm,用于定制用户请求时候表单验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from app01 import models
from django.forms import ModelForm
from django.forms import fields
 
 
class MyForm(ModelForm):
    others = fields.CharField()
 
    class Meta:
        model = models = models.UserInfo
        fields = "__all__"
 
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    form = MyForm

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

1
2
3
4
5
6
7
8
9
@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 = "指定列数据为空时,默认显示"

Django Admin定制的更多相关文章

  1. Django admin定制化,User字段扩展[原创]

    前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...

  2. Django admin美化插件suit应用[原创]

    前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...

  3. 利用 Django admin 完成更多任务(转)

    利用 Django admin 完成更多任务   Django admin Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然 ...

  4. Django的admin定制

    1,models编写 #encoding=utf-8 from django.db import models # Create your models here. class BookInfo(mo ...

  5. 定制django admin页面的跳转

    在django admin的 change_view,  add_view和delete_view页面,如果想让页面完成操作后跳转到我们想去的url,该怎么做 默认django admin会跳转到ch ...

  6. Django admin site(二)ModelAdmin methods

    ModelAdmin methods save_model(request, obj, form, change) 此方法为admin界面用户保存model实例时的行为.request为HttpReq ...

  7. Django admin site(一)ModelAdmin Options

    Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 要使用admin,可以按照下面的步骤: 将'dj ...

  8. Django admin 组件 原理分析与扩展使用 之 sites.py (一)

    一 . 前言 Django 提供了admin 组件 为项目提供基本的管理后台功能(对数据表的增删改查). 本篇文章通过 admin源码 简单分析admin 内部原理 ,扩展使用方式,为以后进行定制和自 ...

  9. Django Admin的相关知识

    一.面向对象复习 1.类的继承 class Base(object): def __init__(self,val): self.val = val def func(self): self.test ...

随机推荐

  1. 20145333 《网络对抗技术》 PC平台逆向破解

    20145333 <网络对抗技术> PC平台逆向破解 20145333 <网络对抗技术> PC平台逆向破解 Shellcode注入 基础知识 Shellcode实际是一段代码, ...

  2. vs+qt使用资源文件

    1.在Resources目录新建一个.qrc文件 2.在解决方案的Resource Files中添加这个文件 3.为这个qrc添加资源,建议把资源都放进Resources

  3. What's the difference between SDK and Runtime in .NET Core?

    What's the difference between SDK and Runtime in .NET Core? Answer1 According to the .Net Core Guide ...

  4. MyBatis小案例完善增强

    https://blog.csdn.net/techbirds_bao/article/details/9233599 上链接为一个不错的Mybatis进阶博客 当你把握时间,时间与你为伍. 将上一个 ...

  5. 比较两个JSON字符串是否完全相等

    RT,比较两个JSON字符串是否完全相等,这里使用google贡献的Gson. 一,no POJO,即不另外创建一个简单Java类 [java] view plain copy String str1 ...

  6. Intel Caffe 与原生Caffe

    1.  首先安装好docker,拉取intel caffe image: $ docker pull bvlc/caffe:intel 试着运行: $ docker run -it bvlc/caff ...

  7. 解决本地项目推送到码云(github),上提示:failed to push some refs to ...

    本地项目上传github 命令如下: 1.git init 2.git add . 3.git commit  -m "init" 4.git remote add origin ...

  8. linux下运行jar

    方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二: java -jar XXX.jar ...

  9. UVA-1515 Pool construction (最小割)

    题目大意:有一块地,分成nxm块.有的块上长着草,有的块上是荒地.将任何一块长着草的块上的草拔掉都需要花费d个力气,往任何一块荒地上种上草都需要花费f个力气,在草和荒地之间架一个篱笆需要花费b个力气, ...

  10. 《BAT前端进阶[师徒班]》学习总结

    这是一个培训课 是的,这是一个面向中级前端的培训班,但明显跟传统的填鸭式培训班不太一样.这边的老师都是大牛这是毫无疑问的,而且都是一线开发人员.而且课程一开始就说明了面向了是有1-3年有工作经验的前端 ...