11-Django站点管理

站点管理

内容发布的部分由网站的管理员负责,包括查看、添加、修改、删除数据

开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块

在Django项目中默认启用Admin管理站点

列表页选项
编辑页选项
重写模板

1、启动mysql数据库:

  DATABASES = {
      'default': {
          'ENGINE': 'django.db.backends.mysql',
          'NAME': 'bookdb',
          'HOST': 'localhost',
          'PORT': '3306',
          'USER': 'root',
          'PASSWORD': '',
      }
  }

2、models.py文件中,定义模型类(没有迁移数据表的需要线迁移数据表)

python manage.py makemigrations

python manage.py migrate
from django.db import models

# Create your models here.
#创建作者信息表
class Authors(models.Model):
    name = models.CharField(max_length=20)#作者名字
    gender = models.BooleanField(default=True)#性别
    age = models.IntegerField()#年龄
    addr = models.CharField(max_length=60)
    tel = models.IntegerField()
    #元类修改表名
    class Meta:
        db_table = "authors"
    def __str__(self):
        return self.name
#创建书籍信息
class Books(models.Model):
    name = models.CharField(max_length=20)#书名
    pub_data = models.DateField(null=True)#出版日期
    #参数max_digits表示总位数 参数decimal_places表示小数位数
    price = models.DecimalField(max_digits=8,decimal_places=2)#价格
    publish = models.CharField(max_length=20)
    #外键 将字段定义在多的一端中 级联删除
    author = models.ForeignKey(Authors,on_delete=models.CASCADE)
    #修改表名(元类)
    class Meta:
        db_table = "books"

    def __str__(self):
        return self.name

3、创建管理员的用户名和密码

python manage.py createsuperuser

4、在admin.py文件中将书籍与作者类名注册到后台站点

from django.contrib import admin
from Book.models import *
# Register your models here.
admin.site.register(Authors)

#为了让站点显示书籍完整信息,需要重新注册模型类
class BookAdmin(admin.ModelAdmin):
    list_display = ["id","name","pub_data","price","publish","author_id"]

admin.site.register(Books,BookAdmin)

5、输入网址http://127.0.0.1:8000/admin/登录后台站点

进去就可以查看、添加、修改、删除操作

6、重写模型的__str__显示各个模型类的name(我上面已经写出来了)

  # 在站点显示name而不是模型类对象
  def __str__(self):
      return self.name.encode('utf-8')

控制站点管理页的展示

  ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式

1、注册参数:

#为了让站点显示书籍完整信息,需要重新注册模型类
class BookAdmin(admin.ModelAdmin):
    list_display = ["id","name","pub_data","price","publish","author_id"]

admin.site.register(Books,BookAdmin)

2、注册装饰器

 @admin.register(Books)
  class BookAdmin(admin.ModelAdmin):
      pass

接下来就可以在类BookAdmin中控制列表页、增加修改页展示效果(例如注册参数的例子)

1、列表页选项

  页大小:指定每页多少条数据,默认为每页显示100条数据

list_per_page = 5
#为了让站点显示书籍完整信息,需要重新注册模型类
class BookAdmin(admin.ModelAdmin):
    list_display = ["id","name","pub_data","price","publish","author_id"]
    #在管理站点页大小,指定每页5条
    list_per_page = 5
admin.site.register(Books,BookAdmin)

 操作选项Action(动作)的位置(默认在管理页的顶部有一个,管理页底部每页)

actions_on_top = True

action_on_bottom = False
#为了让站点显示书籍完整信息,需要重新注册模型类
class BookAdmin(admin.ModelAdmin):
    list_display = ["id","name","pub_data","price","publish","author_id"]
    #在管理站点页大小,指定每页5条
    list_per_page = 5
    #在底部新加一个Action
    actions_on_bottom = True
admin.site.register(Books,BookAdmin)

 列表中的列:

 list_display=[字段1, 字段2, ...]
#为了让站点显示书籍完整信息,需要重新注册模型类(列表中的列)
class BookAdmin(admin.ModelAdmin):
    list_display = ["id","name","pub_data","price","publish","author_id"]

admin.site.register(Books,BookAdmin)

模型方法作为列(地区示例:复制过来的):

模型方法和模型字段都指定为列显示在管理界面上

模型方法作为列无法直接点击列头排序,如果需要排序需要为方法指定排序依据

# 定义AreaInfo模型方法作为列
def title(self):
  return self.name
list_display = ['id', 'name', 'parent', 'title']

浏览效果

方法作为列排序:指定方法作为列的排序依据

  # 定义模型方法作为列
  def title(self):
      return self.name
  # 指定方法作为列的排序依据
  title.admin_order_field = 'name'

***列标题:

列标题默认为属性或方法的名称,可以通过属性设置为其他名称

列标题的设置方式

1.short_description属性设置
2.verbose_name属性设置

short_description属性设置

需要先将模型字段封装成方法,再对方法使用这个属性,模型字段不能直接使用

short_description属性

方法名.short_description = '列标题'
# 定义模型方法作为列
def title(self):
  return self.name
# 指定方法作为列的排序依据
title.admin_order_field = 'name'
# 修改模型title方法作为列的标题名称
title.short_description = '区域名称'

verbose_name属性设置

定义模型字段时指定该属性的值

# 地区列表信息
class AreaInfo(models.Model):
  name = models.CharField(verbose_name='地区标题', max_length=30) #名称
  parent = models.ForeignKey('self',null=True,blank=True) #关系

  # 元类信息 :修改表名
  class Meta:
      db_table = 'areainfo'

浏览效果

右侧栏过滤器

只能接收字段,会将对应字段的值列出来,用于快速过滤,一般用于有重复值的字段

  list_filter = ['字段1', '字段2', ...]
  class AreaAdmin(admin.ModelAdmin):
      # 右侧栏过滤器
      list_filter = ['name']

浏览效果

搜索框

用于对指定字段的值进行搜索,支持模糊查询

 search_fields = ['字段1', '字段2', ...]
  class AreaAdmin(admin.ModelAdmin):
      # 搜索框
      search_fields = ['name']

浏览效果

2、编辑页选项

进入编辑页面

字段顺序

根据列表顺序指定编辑界面字段顺序

  fields = ['字段1', '字段2', ...]
  class AreaAdmin(admin.ModelAdmin):
      # 显示字段顺序
      fields = ['parent', 'name']

浏览效果

字段分组

字段分组fieldsets与字段顺序fields二选一使用

对字段进行分组管理,有如下两种写法

  fieldsets = (
      ('组1标题', {'fields':('字段1', '字段2')}),
      ('组2标题', {'fields':('字段3', '字段4')}),
  )
  fieldsets = [
      ('组1标题', {'fields':['字段1', '字段2']}),
      ('组2标题', {'fields':['字段3', '字段4']}),
  ]
  class AreaAdmin(admin.ModelAdmin):
      # 字段分组:与fields二选一使用
      fieldsets = [
          ('基本', {'fields':['name']}),
          ('高级', {'fields':['parent']}),
      ]

浏览效果

关联对象

在一对多的关系中,可以在一端的编辑页面中编辑多端的对象

嵌入多端对象的方式包括表格、块两种

类型InlineModelAdmin:表示在模型的编辑页面嵌入关联模型的编辑

子类StackedInline:以块的形式嵌入
子类TabularInline:以表格的形式嵌入

admin.py文件中,创建AreaStackedInline类,继承自admin.StackedInline

  class AreaStackedInline(admin.StackedInline):
      model = AreaInfo #关联子对象
      extra = 2 #额外编辑2个子对象
  class AreaAdmin(admin.ModelAdmin):
      # 嵌入关联子对象
      inlines = [AreaStackedInline]

浏览效果:以块形式嵌入

浏览效果:以列表形式嵌入

以上站点管理的素材以及教程来源于github:记录下来,以便需要时能迅速查阅,翻看。

3、重写模板

  当我们需要修改站点管理页面的样式时,可以重写站点的模板

步骤:

  1、在templates目录下创建admin目录

 2、打开当前虚拟环境中的Django目录,在向下找到站点页面的模板

 代码如下:

{% extends "admin/base.html" %}

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block branding %}
{#<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>#}

{# 自定义内容 #}
<h1 id="site-name"><a href="{% url 'admin:index' %}">welcome use manage!!!</a></h1>

{% endblock %}

{% block nav-global %}{% endblock %}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注