Django在管理员中过滤多个到多个字段?

And*_*rew 23 python django django-models django-admin

我有三个对象:

Thing
  some fields

Bucket
  things = models.ManyToManyField(Thing)

User
  buckets = models.ManyToManyField(Bucket)
  things = models.ManyToManyField(Thing)
Run Code Online (Sandbox Code Playgroud)

在管理员中编辑我的"Bucket"字段时,我希望能够选择Things,但只能选择当前登录用户的"Things"列表中的那些内容.

我怎样才能做到这一点?换句话说,如何在Bucket管理员中过滤事物列表?

非常感谢您的帮助.

aru*_*mar 29

有一个formfield_for_manytomany.用法类似于defuz给出的答案.

ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs)¶
Run Code Online (Sandbox Code Playgroud)

喜欢的formfield_for_foreignkey方法,formfield_for_manytomany可以重写方法以更改多对多字段的默认表单字段.例如,如果所有者可以拥有多辆汽车并且汽车可以属于多个所有者 - 多对多关系 - 您可以过滤汽车外键字段以仅显示用户拥有的汽车:

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "cars":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • @Travis`super()`在python3中不需要参数. (2认同)

def*_*fuz 24

阅读文档:

class BucketAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "things":
             kwargs["queryset"] = Things.objects.filter(...)
        return super(BucketAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`formfield_for_foreignkey` 用于 ForeignKey,`formfield_for_manytomany` 用于 ManyToManyField。 (5认同)
  • 另请注意,在 python3 中,您可以使用 `super()` 而不是 `super(BucketAdmin, self)`。 (3认同)