• 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 %}

  • 相关阅读:
    Codevs 2597 团伙(并查集)
    Codevs 1074 食物链 2001年NOI全国竞赛
    Bzoj 3831 [Poi2014]Little Bird
    Codevs 4600 [NOI2015]程序自动分析
    Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
    段落排版--中文字间距、字母间距
    段落排版--行间距(行高)
    段落排版--缩进
    文字排版--删除线
    文字排版--下划线
  • 原文地址:https://www.cnblogs.com/lishuntao/p/11674100.html
Copyright © 2020-2023  润新知