Django后台管理

使用

  1. 本地化

    1
    2
    3
    # settings.py文件
    LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'Asia/Shanghai'
  2. 创建超级管理员

    1
    python manage.py createsuperuser
  3. 注册模型类

    1
    2
    3
    4
    5
    6
    7
    # 应用对象的admin.py文件中
    from wuxiang.models import Book, Hero

    class HeroAdmin(admin.ModelAdmin):
    list_display = ['hname', 'hcomment', 'hgender', 'hook']

    admin.site.register(Hero, HeroAdmin)

列表页

  • 修改后台列表页显示内容

    1
    2
    3
    4
    5
    6
    7
    # 修改应用对象的models.py文件
    class Book(models.Model):
    btitle = models.CharField(max_length=256)

    def __str__(self):
    # 添加__str__返回方法
    return self.btitle
  • 后台每页显示内容的条数、多列内容

    1
    2
    3
    4
    5
    # 修改应用中的admin.py文件
    class BookAdmin(admin.ModelAdmin):
    list_display = ['btitle', 'bcontent', 'bpub_date']
    # 添加该属性,表示每页10条数据
    list_per_page = 10
  • 通过方法修改列表页要展示的列表内容

    1. 修改app中models.py文件,添加方法和对应的属性

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 修改应用下models.py文件,自定义方法
      class Book(models.Model):
      # 修改已知字段在后台的显示名称,通过添加参数:verbose_name='标题'
      bpub_date = models.CharField(verbose_name='日期', max_length=256)

      def title(self):
      # title方法返回bpub_date这一列
      return self.bpub_date
      # 添加后台列表页title字段的排列方式是按照bpub_date进行排序,方法名本身不支持排序
      title.admin_order_field = 'bpub_date'
      # 给title方法的列指定一个自定义的名称
      title.short_description = '时间'
    2. admin.py文件中的list_display添加方法名

      1
      2
      3
      # 修改应用中的admin.py文件
      class BookAdmin(admin.ModelAdmin):
      list_display = ['btitle', 'bcontent', 'title']
  • 修改列表页操作下拉框的位置

    1
    2
    3
    4
    5
    6
    # 修改对应应用下的admin.py文件
    class BookAdmin(admin.ModelAdmin):
    list_display = ['btitle', 'bcontent', 'bpub_date', 'title']
    # True表示显示出来,False表示不显示
    actions_on_bottom = True
    actions_on_top = False
  • 添加列表页右侧过滤栏

    1
    2
    3
    4
    5
    # 修改对应app下的admin.py文件
    class BookAdmin(admin.ModelAdmin):
    list_display = ['btitle', 'bcontent', 'bpub_date', 'title']
    # list_filter的列表中填写用于过滤的字段名,但是他不能是方法名
    list_filter = ['btitle', 'bcontent']
  • 添加列表页上方的搜索框

    1
    2
    3
    4
    5
    # 修改对应app下的admin.py文件
    class BookAdmin(admin.ModelAdmin):
    list_display = ['btitle', 'bcontent', 'bpub_date', 'title']
    # 添加列表页上方的搜索框,列表中的参数是该搜索框支持的搜索字段
    search_fields = ['btitle', 'bcontent']
  • 利用一对多的关系,通过外键访问到一端对应的内容,并显示在当前列表中

    1. 修改models.py文件中的模型对象

      1
      2
      3
      4
      5
      6
      7
      8
      # 修改对应app下的models.py文件
      class Hero(models.Model):
      hname = models.CharField(max_length=50)
      hook = models.ForeignKey("Book", on_delete=models.CASCADE)

      def parent(self):
      # 通过外键对象访问到父级的属性
      return self.hook.btitle
    2. 在app对应的admin.py文件中list_display添加该方法

      1
      2
      class HeroAdmin(admin.ModelAdmin):
      list_display = ['hname','shuai','parent']

编辑页

  • 修改编辑页各列显示顺序

    1
    2
    3
    4
    5
    # 修改app对应的admin.py文件
    class BookAdmin(admin.ModelAdmin):
    list_display = ['btitle', 'bcontent', 'bpub_date', 'title']
    # 非可编辑列不可写在其中,如方法名
    fields = ['bcontent', 'btitle', 'bpub_date']
  • 编辑页的内容分组展示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 修改app对应的admin.py文件
    # fieldsets与fields参数相冲突,只能选择其一
    class BookAdmin(admin.ModelAdmin):
    list_display = ['btitle', 'bcontent', 'bpub_date', 'title']
    # 将要展示的列分不同组进行展示,是元组套着元组
    fieldsets = (
    # '基本'是分组名称;fields是分组中展示的列内容
    ('基本', {"fields":['bcontent']}),
    ('内容部分', {"fields": ['btitle', 'bpub_date']})
    )
  • 利用一对多的外键关系,在一端直接显示修改多端的内容

    1. 以块状显示多端的内容

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 修改app对应的admin.py文件
      # 创建一个类,继承StackedInline类
      class BookStackedInline(admin.StackedInline):
      # model参数写对应的类名
      model = Hero
      # 多端预留的可编辑内容的条数
      extra = 2

      class BookAdmin(admin.ModelAdmin):
      list_display = ['hname', 'hcbcontentomment', 'hgender', 'hook', 'parent']
      # inlines参数中填写刚刚定义的类名
      inlines = [BookStackedInline]
    2. 以列表显示多端的内容

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 修改app对应的admin.py文件
      # 创建一个类,继承TabularInline类
      class BookTabularInline(admin.TabularInline):
      # model参数写多端对应的类名
      model = Hero
      # 多端预留的可编辑内容的条数
      extra = 2

      class BookAdmin(admin.ModelAdmin):
      list_display = ['hname', 'hcbcontentomment', 'hgender', 'hook', 'parent']
      # inlines参数中填写刚刚定义的类名
      inlines = [BookTabularInline]

重写Admin后台模板

  1. 寻找到admin默认的模板路径

    1
    2
    # 位于python虚拟环境下
    \Django重置\venv\Lib\site-packages\django\contrib\admin\templates\admin\base.html
  2. 在项目的模板目录下创建文件夹admin

    1
    2
    # 如果需要修改什么模板内容,则将第一步中对应的模板文件赋值到该目录下进行编辑
    mkdir admin