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

时间:2014-11-09 01:57:15

标签: python django

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

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?

由于

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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