【问题标题】:filter_horizon or filter_vertical for InLine ManyToMany field at Django 2.x AdminDjango 2.x Admin 中 InLine ManyToMany 字段的 filter_horizo​​n 或 filter_vertical
【发布时间】:2019-03-07 20:11:29
【问题描述】:

这是我的模型关系(复制自 Django 2.1 官方文档 - 我的模型是这个的精确副本但只有模型名称不同。):

class Person(models.Model):
    name = models.CharField(max_length=50)

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(
        Person,
        through='Membership',
        through_fields=('group', 'person'),
    )

class Membership(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)

这是我的 admin.py:

class MembershipInLine(admin.StackedInline):
    model = Membership

class PersonAdmin(admin.ModelAdmin):
    inlines = [
        MembershipInLine,
    ]

我的个人页面上的字段如下所示: Current view

但相反,我希望有这种观点: Desired view

我在official documentation 中找到了filter_horizontal 和filter_vertical,但我不知道如何将它们与内联一起使用。我该怎么做?

编辑:

我已经按照文档中的描述进行了尝试:

class MembershipInLine(admin.StackedInline):
    model = Membership # (and also tried with = Group.members.through)
    filter_horizontal = ('group', )

但它会抛出:

(admin.E020) 'filter_horizo​​ntal[0]' 的值必须是多对多字段。

【问题讨论】:

  • 根据文档,水平过滤器和垂直过滤器适用于许多字段。因此,在您的情况下,它们可以与 Group 一起使用。
  • @not2acoder 我的模型已经是ManyToMany
  • 所以 filter_horizo​​ntal 可以用在 group admin 中,一个具有 manytomany 字段的模型,而不是 person。
  • 它不适用于您的建议或我的第一种方法(使用中间模型)@not2acoder,您可以在编辑部分看到
  • 由于您使用的是Intermediate through model,在这种情况下显示filter_horizo​​ntal并不容易,请参见:stackoverflow.com/questions/44714416/…

标签: python django django-2.1


【解决方案1】:

我会咨询 auth 管理面板以获取组的权限。尝试类似

class PersonAdmin(admin.ModelAdmin):
    search_fields = ()
    ordering = ()
    filter_horizontal = ('membership',)

    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        if db_field.name == 'membership':
            qs = kwargs.get('queryset', db_field.remote_field.model.objects)
            # Avoid a major performance hit resolving membership names which
            # triggers a content_type load:
            kwargs['queryset'] = qs.select_related('content_type')
        return super().formfield_for_manytomany(db_field, request=request, **kwargs)

https://github.com/django/django/blob/master/django/contrib/auth/admin.py#L29

【讨论】:

  • 我已经完全按照您的建议进行了尝试。我仍然遇到同样的错误。
猜你喜欢
  • 2013-05-23
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2021-10-18
  • 2019-08-15
  • 1970-01-01
相关资源
最近更新 更多