11-Django站点管理

元气小坏坏 提交于 2019-12-01 08:47:57

站点管理

  • 内容发布的部分由网站的管理员负责,包括查看、添加、修改、删除数据
    • 开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,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 %}

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!