zoukankan      html  css  js  c++  java
  • 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 %}

  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/lishuntao/p/11674100.html
Copyright © 2011-2022 走看看