Django Admin:在ManyToMany字段中仅显示一些对象?

时间:2019-07-01 09:55:55

标签: django django-models django-admin

我有一个相对简单的数据模型,其中包含UserGroupTask。每个小组都有自己的任务和用户。只能将用户分配到一个组。

任务属于组,每个任务都有用户的manyToMany字段,因此可以为多个用户分配相同的任务。

在管理员中,为用户分配任务时,它会显示所有已创建的用户,我希望它仅显示与任务属于同一组的用户。

什么是最好的方法?

我已经检查了admin.ModelAdmin的可用自定义选项,但没有发现与我的问题有关的任何内容。

2 个答案:

答案 0 :(得分:1)

您可以使用formfield_for_manytomany

可以重写formfield_for_manytomany方法,以将默认表单字段更改为多对多字段

根据您的情况,将admin.py更改为:

class TaskAdmin(admin.ModelAdmin):

    def get_object(self, request, object_id, s):
        # Hook obj for use in formfield_for_manytomany
        self.obj = super(TaskAdmin, self).get_object(request, object_id)
        # print ("Got object:", self.obj)
        return self.obj


    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "user":
            kwargs["queryset"] = User.objects.filter(task=self.obj)
        return super().formfield_for_manytomany(db_field, request, **kwargs)

admin.site.register(Task, TaskAdmin)

答案 1 :(得分:1)

您可以使用以下方法自定义模型管理员:formfield_for_manytomany

class TaskAdmin(admin.ModelAdmin):

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "users":
            # Filter your users below as per your condition
            kwargs["queryset"] = Users.objects.filter()
        return super(TaskAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)