admin后台管理

django给你提供了一个可视化的界面用来让你方便的对你的模型表
进行数据的增删改查操作

如果你先想要使用amdin后台管理操作模型表
你需要先注册你的模型表告诉admin你需要操作哪些表

去你的应用下的admin.py中注册你的模型表

admin.py注册需要管理操作的模型表


from django.contrib import admin
from app01 import models

# Register your models here.
admin.site.register(models.UserInfo)    # 注册的表名会默认加个后缀s,如果想自定义可以在models.py中在类中定义一个Meta类,见下面
admin.site.register(models.Blog)
admin.site.register(models.Category)
admin.site.register(models.Tag)
admin.site.register(models.Article)
admin.site.register(models.Article2Tag)
admin.site.register(models.UpAndDown)
admin.site.register(models.Comment)

表名默认会加s后缀,可以在models.py中更改,如下:

from django.db import models
from django.contrib import auth
from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    phone = models.BigIntegerField(null=True,verbose_name="手机号")
    # 头像
    avatar = models.FileField(upload_to="avatar/",default='avatar/default.png')
    """
    给avatar字段传文件对象 该文件会自动存储到avatar文件夹 然后avatar字段只保存文件路径avatar/default.png
    """
    create_time = models.DateTimeField(auto_now_add=True)

    blog = models.OneToOneField(to='Blog',null=True)
    class Meta:
        verbose_name_plural = "用户表"   # 修改admin后台管理默认的表名
        # verbose_name = "用户表"     # 使用verbose_name更改还是会加s ==> 用户表s

模型类中Meta的其他选项

https://blog.csdn.net/weixin_30394019/article/details/112162982

注意1:

# admin会给每一个注册了的模型表自动生成增删改查四条url
http://127.0.0.1:8000/admin/app01/userinfo/ 查
http://127.0.0.1:8000/admin/app01/userinfo/add/ 增
http://127.0.0.1:8000/admin/app01/userinfo/1/change/ 改
http://127.0.0.1:8000/admin/app01/userinfo/1/delete/ 删


http://127.0.0.1:8000/admin/app01/blog/ 查
http://127.0.0.1:8000/admin/app01/blog/add/ 增
http://127.0.0.1:8000/admin/app01/blog/1/change/ 改
http://127.0.0.1:8000/admin/app01/blog/1/delete/ 删

"""
关键点就在于urls.py中的第一条自带的url

前期我们需要自己手动苦逼的录入数据,自己克服一下
"""

注意2:虽然我们在models.py中的class模型类中设置了字段可以为空,但是admin后台管理不允许为空,如果要admin后台管理也可以为空需要给字段添加blank=True

from django.db import models
from django.contrib import auth
from django.contrib.auth.models import AbstractUser

# Create your models here.

class UserInfo(AbstractUser):
    phone = models.BigIntegerField(null=True,blank=True,verbose_name="手机号")
    """
    null=True   数据库该字段可以为空
    blank=True  admin后台管理该字段可以为空
    """

    # 头像
    avatar = models.FileField(upload_to="avatar/",default='avatar/default.png')
    """
    给avatar字段传文件对象 该文件会自动存储到avatar文件夹 然后avatar字段只保存文件路径avatar/default.png
    """
    create_time = models.DateTimeField(auto_now_add=True)

    blog = models.OneToOneField(to='Blog',null=True)
    class Meta:
        verbose_name_plural = "用户表"
        # verbose_name = "用户表"     # 使用verbose_name更改还是会加s ==> 用户表s

    def __str__(self):
        return self.username

admin后管定制-显示字段

  • models.py
from django.db import models


# Create your models here.
class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    # auto_now_add=True 只要记录创建,不需要手动插入时间,自动把当前时间插入
    create_time = models.DateTimeField(auto_now_add=True)
    # auto_now=True,只要更新,就会把当前时间插入
    last_update_time = models.DateTimeField(auto_now=True)

    # import datetime
    # create_time=models.DateTimeField(default=datetime.datetime.now)
    class Meta:
        # 单个字段,有索引,有唯一
        # 多个字段,有联合索引,联合唯一
        abstract = True  # 抽象表,不在数据库建立出表



class Book(BaseModel):
    # verbose_name admin中显示中文
    name = models.CharField(max_length=32, verbose_name='书名', help_text='这里填书名')
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格')
    # 一对多的关系一旦确立,关联字段写在多的一方
    # to_field 默认不写,关联到Publish主键
    # db_constraint=False  逻辑上的关联,实质上没有外键练习,增删不会受外键影响,但是orm查询不影响
    publish = models.ForeignKey(to='Publish', on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='出版社')
    # 多对多,跟作者,关联字段写在 查询次数多的一方
    # 什么时候用自动,什么时候用手动?第三张表只有关联字段,用自动    第三张表有扩展字段,需要手动写
    # 不能写on_delete
    authors = models.ManyToManyField(to='Author', db_constraint=False, verbose_name='作者')

    class Meta:
        verbose_name_plural = '图书表'  # admin中表名的显示

    def __str__(self):
        return self.name

    @property
    def publish_name(self):
        return self.publish.name

    # def author_list(self):
    def author_list(self):
        author_list = self.authors.all()
        # ll=[]
        # for author in author_list:
        #     ll.append({'name':author.name,'sex':author.get_sex_display()})
        # return ll
        return [{'name': author.name, 'sex': author.get_sex_display()} for author in author_list]


class Publish(BaseModel):
    name = models.CharField(max_length=32, verbose_name='出版社名称')
    addr = models.CharField(max_length=32, verbose_name='出版社地址')

    class Meta:
        verbose_name_plural = '出版社表'

    def __str__(self):
        return self.name


class Author(BaseModel):
    name = models.CharField(max_length=32, verbose_name='作者名称')
    sex = models.IntegerField(choices=((1, '男'), (2, '女')), verbose_name='性别')
    # 一对一关系,写在查询频率高的一方
    # OneToOneField本质就是ForeignKey+unique,自己手写也可以
    authordetail = models.OneToOneField(to='AuthorDetail', db_constraint=False, on_delete=models.CASCADE, verbose_name='作者详情')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = '作者表'


class AuthorDetail(BaseModel):
    mobile = models.CharField(max_length=11, verbose_name='手机号')

    class Meta:
        verbose_name_plural = '作者详情表'
  • admin.py
from django.contrib import admin
from api import models


# Underwriter admin model
class BookNamePublish(admin.ModelAdmin):
    # 需要显示的字段信息
    list_display = ('name', 'price', 'publish')

    # 设置哪些字段可以点击进入编辑界面,默认是第一个字段
    list_display_links = ('name', 'price')


# 注册时,在第二个参数写上 admin model


# Register your models here.
admin.site.register(models.Book, BookNamePublish)  # 注册的表名会默认加个后缀s,如果想自定义可以在models.py中在类中定义一个Meta类,见下面
admin.site.register(models.Publish)
admin.site.register(models.Author)
admin.site.register(models.AuthorDetail)

效果:

文档更新时间: 2022-09-19 13:23   作者:李延召