Django管理代理模型编辑表单,仅在表单级别上预过滤

问题描述 投票:0回答:2

我为这两个模型制作了代理模型:

Class Student(models.Model):
   name:
   is_special :
   foo_n :
   assigned_teacher (foreign_key to Teacher model) :

并且:

Class Teacher(models.Model):
   name:
   has_certification :
   foo_n :

我制作了一个代理模型来管理学生,因为我的一个用户只需要一个包含几个字段的列表来为特殊学生提供支持。

 Class ManageSpecialStudent(Student):
      class Meta:
         proxy = True

我们的想法是列出所有特殊学生的名单以及所有拥有认证的教师名单。

然后在我的admin.py中,我为该代理模型创建了一个管理类

class ManageSpecialStudentAdmin(admin.ModelAdmin):
       list_display = ('name','foo','assigned_teacher','is_special',...)
       fields = ('name','foo','assigned_teacher',...)

但我想根据教师模型的值过滤可用的assigned_teacher。如果教师具有教授特殊孩子的证明,请将其显示在该代理模型的管理表单列表中。

我做的是

 def get_queryset(self, request):
          return self.model.objects.filter(assigned_teacher__has_certification=True, is_special=True)

它有点工作,问题是查询也影响list_display。所有未分配教师的学生都被过滤掉了,我不希望这样。

有没有办法只在该代理的表单(字段)上将过滤器应用于assigned_teacher?

谢谢

python django
2个回答
1
投票

我设法用以下代码完成:

def get_queryset(self, request):
    return self.model.objects.filter(is_special=True,)

def render_change_form(self, request, context, *args, **kwargs):
     context['adminform'].form.fields['assigned_teacher'].queryset = Teacher.objects.filter(has_certification=True)
     return super(ManageSpecialStudent, self).render_change_form(request, context, *args, **kwargs)

0
投票

管理员级别的更简单的解决方案,而不是修改模型(当您有代理管理模型,而不是代理模型时)是执行以下操作:

class ManageSpecialStudentAdmin(admin.ModelAdmin):
    list_display = ('name','foo','assigned_teacher','is_special',...)
    fields = ('name','foo','assigned_teacher',...)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(assigned_teacher__has_certification=True, is_special=True)

有关如上所述使用django admin的更多信息,请查看this

© www.soinside.com 2019 - 2024. All rights reserved.