Python Django管理代理模型编辑表单,仅在表单级别进行预筛选

Python Django管理代理模型编辑表单,仅在表单级别进行预筛选,python,django,Python,Django,我为这两个模型制作了一个代理模型: Class Student(models.Model): name: is_special : foo_n : assigned_teacher (foreign_key to Teacher model) : 以及: 我制作了一个代理模型来管理学生,因为我的一个用户只需要一个带有几个字段的列表来管理特殊学生 Class ManageSpecialStudent(Student): class Meta:

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

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

我制作了一个代理模型来管理学生,因为我的一个用户只需要一个带有几个字段的列表来管理特殊学生

 Class ManageSpecialStudent(Student):
      class Meta:
         proxy = True
这个想法是要有一份所有特殊学生的名单和一份拥有证书的所有教师的名单

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

class ManageSpecialStudentAdmin(admin.ModelAdmin):
       list_display = ('name','foo','assigned_teacher','is_special',...)
       fields = ('name','foo','assigned_teacher',...)
但我想根据教师模型上的值筛选可用的指定教师。如果老师有证书教一个特殊的孩子,在代理模型的管理表单列表中显示他

我所做的是

 def get_queryset(self, request):
          return self.model.objects.filter(assigned_teacher__has_certification=True, is_special=True)
这是可行的,问题是查询也会影响列表的显示。所有没有指定老师的学生都被过滤掉了,我不想这样

是否有一种方法仅将筛选器应用于该代理的表单(字段)上指定的_教师


谢谢

我用以下代码成功地做到了这一点:

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)

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

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的更多信息,请查看。

。。。无法复制。不知道Django是哪个版本。Sorry@fero当时是1.6.x,到今天为止,这段代码在1.8.x上运行,并且仍然有效
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)