django之admin后台管理
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)
效果:


浙公网安备 33010602011771号