32

我有三个对象:

Thing
  some fields

Bucket
  things = models.ManyToManyField(Thing)

User
  buckets = models.ManyToManyField(Bucket)
  things = models.ManyToManyField(Thing)

在管理员中编辑我的“存储桶”字段时,我希望能够选择事物,但只能选择当前登录用户的“事物”列表中的那些事物。

我怎样才能做到这一点?换句话说,如何过滤 Bucket admin 中的 Things 列表?

非常感谢您提前提供的帮助。

4

3 回答 3

41

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

ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs)¶

与该formfield_for_foreignkey方法一样,formfield_for_manytomany可以重写该方法以更改多对多字段的默认表单字段。例如,如果一个车主可以拥有多辆汽车并且汽车可以属于多个车主——多对多关系——您可以过滤 Car 外键字段以仅显示用户拥有的汽车:

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)
于 2013-07-03T20:46:25.437 回答
27

阅读文档

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)
于 2012-08-29T12:19:28.790 回答
0

可以使用django-selectabledjango-autocomplete-light

于 2012-08-29T09:56:27.590 回答