Django Admin页面显示父表,编辑子表

默认情况下,ModelAdmin只允许您管理模型“本身”字段,而不是相关模型.以下方法将实现,在应用类的列表管理显示页面,显示父表的字段;在编辑页面,父表对子表进行编辑.
models.py如下

class Level(models.Model):
    # l_num = models.IntegerField(default=0, verbose_name='序号')
    name = models.CharField(max_length=20)
    is_delete = models.BooleanField(default=False)
    
    def __str__(self):
        return self.name

class Grades(models.Model):
    name = models.CharField(max_length=20, verbose_name='班级')
    # 外键,这里关联模型Level与模型名称一样,不是全小写。
    level = models.ForeignKey('Level', on_delete=models.DO_NOTHING)
    is_delete = models.BooleanField(default=False)
    
    def __str__(self):
        return '%s%s' % (self.level, self.name)

class Students(models.Model):
    name = models.CharField(max_length=20, db_index=True, verbose_name='姓名')
    age = models.IntegerField(verbose_name='年龄')

    # 需要先提供一个二维的二元元组,第一个元素表示存在数据库内真实的值,第二个表示页面上显示的具体内容
    SEX_CHOICE = (
        ('男', '男'),
        ('女', '女'),
    )
    sex = models.CharField(max_length=10, choices=SEX_CHOICE, verbose_name='性别', default='男')
    grade = models.ForeignKey('Grades', on_delete=models.DO_NOTHING, verbose_name="班级")
    img_student = models.ImageField(upload_to='img_student', default='img_student/default.png', verbose_name='头像')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    last_update_time = models.DateTimeField(auto_now=True, verbose_name='上次更新时间')
    is_delete = models.BooleanField(default=False)
    
    def __str__(self):
        return self.name

在admin.py代码如下:

@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
    list_display = ('name', 'age', 'sex', 'grade', 'create_time', 'last_update_time', 'is_delete')

做完之后,显示的效果如下:
在这里插入图片描述

1 在应用类的列表管理显示页面,显示父表的字段

可以让Students,显示父表Grades的父表Level字段
在models.py里的Students类里,写上如下代码:

class Students(models.Model):
	    # 写一个方法,定义在管理页面上能够显示的外键字段字段
	    # grade为Students模型的外检表,level为Grades模型的外检表,那么为Level模型的字段
	    def dis_level(self):
       		 return self.grade.level.name

   	 	# 定义该字段在管理后台显示的名称
   	 	dis_level.short_description = '年级'
   	 	
    # 定义该字段在管理后台显示的名称
    dis_level.short_description = '年级'
    # 方法列是不能排序的,如果需要排序需要为方法指定排序依据。添加的是'模型类字段'
    # 如果是外键需要遵循这样的语法:本表外键字段__(双下划线)外检表字段或外检表的外键字段__最终外键表要显示的字段。
    dis_level.admin_order_field = 'grade__level__name'

在admin.py里,把Students类里的方法,加入到list_display里:

@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
    list_display = ('name', 'age', 'sex', 'grade', 'dis_level', 'create_time', 'last_update_time', 'is_delete')

写完之后,显示的结果如下,多了年级,以及点击年级可以进行排序:
在这里插入图片描述

2 在编辑页面,父表对子表进行编辑.

默认对学生编辑时,无法在编辑页面直接编辑相关联的子表,例如:
models.py代码:

class Students(models.Model):
    name = models.CharField(max_length=20, db_index=True, verbose_name='姓名')
    age = models.IntegerField(verbose_name='年龄')

    # 需要先提供一个二维的二元元组,第一个元素表示存在数据库内真实的值,第二个表示页面上显示的具体内容
    SEX_CHOICE = (
        ('男', '男'),
        ('女', '女'),
    )
    sex = models.CharField(max_length=10, choices=SEX_CHOICE, verbose_name='性别', default='男')
    grade = models.ForeignKey('Grades', on_delete=models.DO_NOTHING, verbose_name="班级")
    img_student = models.ImageField(upload_to='img_student', default='img_student/default.png', verbose_name='头像')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    last_update_time = models.DateTimeField(auto_now=True, verbose_name='上次更新时间')
    is_delete = models.BooleanField(default=False)
    
    def __str__(self):
        return self.name


class Course(models.Model):
    name = models.CharField(max_length=20, verbose_name='课名')
    is_delete = models.BooleanField(default=False)
    
    def __str__(self):
        return self.name


class Score(models.Model):
    s_score = models.IntegerField(default=0, verbose_name='分数')
    s_course = models.ForeignKey('Course', on_delete=models.DO_NOTHING, verbose_name='课程')
    s_student = models.ForeignKey('Students', on_delete=models.DO_NOTHING, verbose_name='学生姓名')
    is_delete = models.BooleanField(default=False)
    
    def __str__(self):
        # 要把s_score转换为字符串,否则会报下面的错误。
        """
            Exception Type:TypeError
            Exception Value:
            __str__ returned non-string (type int)
            :return:
        """
        return '%s%s%s' % (self.s_student, self.s_course, str(self.s_score))

打开学生的编辑页面,是这样子的:
在这里插入图片描述要给学生添加分数,只能进入Score管理页面,一个个添加,非常麻烦.

使用Django的TabularInline,可以解决这个问题,在父表里对子表进行编辑:
所有代码都在admin.py里写,具体如下:

# 一对多关联表编辑,让父表管理配置页面能同时编辑子表,以下的Score为子表(有外键所在的表)
class ScoreInline(admin.TabularInline):
    # Score 必须是models.py中的模型名称,大小写必须要匹配.这个模型为子表,以便可以被父表编辑
    model = Score
    # 默认显示条目的数量
    # extra = 5
   
class StudentsAdmin(admin.ModelAdmin):
    # Inline把ScoreInline关联进来,让父表管理配置页面能同时编辑子表.
    inlines = [ScoreInline, ]

做完之后,效果如下:
在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值