Представьте manytomany в админке django как горизонтальный фильтр с помощью related_name

Имею следующее:

class User(models.Model)
    blablabla

class Product(models.Model)
    authorized_users = models.ManyToManyField(
        User,
        related_name='shared_products',
    )

Я уже настроил администратора Product, чтобы отображать authorized_users как горизонтальный фильтр, чтобы выбрать всех пользователей, которые могут редактировать продукт.

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

admin.site.register(Product, ProductAdmin)

Проблема в том, что я хочу сделать то же самое в админке User, а это означает, что я хочу иметь горизонтальный фильтр для shared_products, чтобы выбирать продукты, которые этот пользователь может редактировать. Я пробовал следующее, что явно не работает:

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

admin.site.register(User, UserAdmin)

Другие ответы, которые я нашел, рекомендуют использовать Inlines, но, как я видел, они используются для редактирования экземпляра модели на другом конце, что не является тем, что я хочу делать.

У кого-нибудь есть идеи, как этого добиться?

0
0
786
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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

Другие вопросы по теме