Django-admin 管理工具

描述:admin是后台管理工具

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

如:admin.site.register(models.UserInfo)

个性化定制

想实现更多的定制操作,需要利用ModelAdmin进行操作,如:

方式一:
  from django.contrib import admin
  import models
  # Register your models here.
    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, 列表时,定制显示的列。
    list_display 还可以自定义添加其他的功能字段,比如 不用admin组件的删除,自定义一个删除,mark_safe和模板中的safe函数一样,只不过这个是用在views等函数中的
    from django.utils.safestring import mark_safe
    class admin_UserInfo(admin.ModelAdmin):
        def deletes(self):
            return mark_safe("<a href='#'>删除</a>")
        list_display = ["avatar","id",deletes]
    
    admin.site.register(models.UserInfo,admin_UserInfo)
    

  1. list_display_links 定制列可以进行点击跳转,但是字段必须要在list_display中进行展示
  2. list_filter 定制右侧快速筛选。
  3. list_editable 列表时,可以编辑的列
  4. search_fields 添加模糊搜索的功能的字段,如果多个字段符合,会同时显示结果
  5. date_hierarchy 对Date和DateTime类型进行搜索,但是数据多了容易卡,非必要不用
  6. fields,exclude fields 详情页展示的字段和exclude 相反,是排除展示的字段
  7. readonly_fields 详细页面时,只读字段
  8. inlines 如果有book表和category表做FK,那么详细页面可以对2张表进行增删改操作
    更多的多对多表以及其他内链接示例参考 https://www.cnblogs.com/linxiyue/p/4074562.html
module.py
class Blog(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name="个人博客标题", max_length=64)
    sitename = models.CharField(verbose_name="站点名称", max_length=64)
    theme = models.CharField(verbose_name="个人博客主题样式", max_length=32)

    def __str__(self):
        return self.title


class Category(models.Model):
    '''个人文章分类表'''
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name="分类标题", max_length=64)
    blog = models.ForeignKey(to="Blog", verbose_name="所属博客", to_field="nid",on_delete=models.CASCADE)

admin.py

class bookinline(admin.StackedInline):
    model = models.Category
    
class myblog(admin.ModelAdmin):
    list_display = ["sitename","theme"]
    inlines = [bookinline]

admin.site.register(models.Blog,myblog)


10. action 定制action中的操作

class admin_UserInfo(admin.ModelAdmin):
    def deletes(self):
        return mark_safe("<a href='#'>删除</a>")
    list_display = ["id","username",deletes,"telphone","create_time","avatar","email"]

    def batch_set_0(self,request, queryset):
        ret = queryset.filter(blog_id__isnull=True).update(email="abc@sina.com")

    batch_set_0.short_description = "自定义Actions把blog_id为空的邮箱设置为abc@sina.com"
    actions = [batch_set_0, ]
    # Action选项都是在页面上方显示
    actions_on_top = False
    # Action选项都是在页面下方显示
    actions_on_bottom = True
    # 是否显示选择个数
    actions_selection_counter = True


11. 定制HTML模板

  add_form_template = None
  change_form_template = None
  change_list_template = None      后面写模板在templates的路径即可.
  delete_confirmation_template = None
  delete_selected_confirmation_template = None
  object_history_template = None
  1. raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        raw_id_fields = ('FK字段', 'M2M字段',)
    
  2. ordering,列表时,数据排序规则
    字段前的+-代表升序,降序

```
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    ordering = ('-id',)
    或
    def get_ordering(self, request):
        return ['-id', ]
```
  1. radio_fields,详细页面时,使用radio显示选项(FK默认使用select)
    radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
  2. form = ModelForm,用于定制用户请求时候表单验证
```
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
```
  1. 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 = "指定列数据为空时,默认显示"
posted @ 2022-02-28 17:56  零哭谷  阅读(76)  评论(0编辑  收藏  举报