Django 管理员过滤外键组合框

Posted

技术标签:

【中文标题】Django 管理员过滤外键组合框【英文标题】:Django admin filter foreign key combobox 【发布时间】:2018-09-20 02:37:48 【问题描述】:

我是 django 初学者,所以代码可能是基本的或错误的,但无论如何...... 我有以下型号:

 from django.db import models
    from django.conf import settings

    GRADE_CHOICES = (
        ('1', '1'),
        ('2', '2'),
        ('3', '3'),
        ('4', '4'),
        ('5', '5'),
        ('6', '6'),
        ('7', '7'),
        ('8', '8'),
        ('9', '9'),
        ('10', '10'),
    )
    class Professor(models.Model):
        first_name = models.CharField(max_length=20)
        last_name = models.CharField(max_length=30)

        def __str__(self):
            rta = self.first_name+" "+self.last_name
            return rta

    class Student(models.Model):
        first_name = models.CharField(max_length=20, blank=False, null=False)
        last_name = models.CharField(max_length=30, blank=False, null=False)

        def __str__(self):
            rta = self.first_name+" "+self.last_name
            return rta

    class Subject(models.Model):
        first_name = models.CharField(max_length=50)
        students = models.ManyToManyField(Student, blank=True)
        professors = models.ManyToManyField(Professor, blank=True)

        def __str__(self):
            return self.first_name

    class Grade(models.Model):
        value = models.CharField(choices=GRADE_CHOICES, max_length= 2)
        subject = models.ForeignKey(Grade, on_delete=models.CASCADE, related_name='fk_grade')
        student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='fk_student')

        def __str__(self):
            return self.value

要添加成绩,我需要选择学科和学生,因此我想根据学生所属的学科过滤学生。 如果学生不在该学科,他不应该出现在列表中。

我正在使用 django 1.11 和 python 2.7。

【问题讨论】:

【参考方案1】:

您的对象 Grade 不应与 SubjectStudent 相关,而是与 SubjectStudent 之间的关系相关。有点像:

class Professor(models.Model):
    # ...

class Student(models.Model):
    # ...
    professors = models.ManyToManyField(Person, through='Subject')


class Subject(models.Model):
    name = models.CharField(max_length=50)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    professor = models.ForeignKey(Professor, on_delete=models.CASCADE)
    value = models.CharField(choices=GRADE_CHOICES, max_length= 2)

【讨论】:

以上是关于Django 管理员过滤外键组合框的主要内容,如果未能解决你的问题,请参考以下文章

Django,在模型外键中按组过滤用户

Django Admin 自定义外键选择框

Django的管理页面怎么显示和过滤另外一个表的字段,非外键

Django 管理员添加自定义过滤器

Django,从反向外键查询添加数据(外键加入过滤器)

django xadmin