使用 related_name 在 Django 管理中将 ManyToMany 作为水平过滤器呈现

Sto*_*oro 0 django many-to-many django-admin

我有以下内容:

class User(models.Model)
    blablabla

class Product(models.Model)
    authorized_users = models.ManyToManyField(
        User,
        related_name='shared_products',
    )
Run Code Online (Sandbox Code Playgroud)

我已经将 的 管理员配置为Product显示authorized_users为水平过滤器,以便选择可以编辑产品的所有用户。

class ProductAdmin(admin.ModelAdmin):
    filter_horizontal = (
        'authorized_users',
    )

admin.site.register(Product, ProductAdmin)
Run Code Online (Sandbox Code Playgroud)

问题是我想在 的 管理中执行相同的操作User,这意味着我想要 的 水平过滤器shared_products,以便选择该用户能够编辑的产品。我已经尝试过以下显然不起作用的方法:

class UserAdmin(admin.ModelAdmin):
    filter_horizontal = (
        'authorized_users',
    )

admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

我发现的其他答案推荐使用内联,但正如我所见,它们用于编辑另一端的模型实例,这不是我想要做的。

有人知道如何实现这一目标吗?

HP *_*una 5

class UserAdminForm(forms.ModelForm):
  products = forms.ModelMultipleChoiceField(
    queryset=Product.objects.all(), 
    required=False,
    widget=FilteredSelectMultiple(
      verbose_name=_('Products'),
      is_stacked=False
    )
  )

  class Meta:
    model = User

  def __init__(self, *args, **kwargs):
    super(UserAdminForm, self).__init__(*args, **kwargs)

    if self.instance and self.instance.pk:
      self.fields['products'].initial = self.instance.products.all()

  def save(self, commit=True):
    user = super(UserAdminForm, self).save(commit=False)

    if commit:
      user.save()

    if user.pk:
      user.products = self.cleaned_data['products']
      self.save_m2m()

    return user

class UserAdmin(admin.ModelAdmin):
  form = UserAdminForm
Run Code Online (Sandbox Code Playgroud)