Как я могу настроить фильтрацию в DJango Admin?

admin.py

class authUserMenu(admin.ModelAdmin):
    list_display = ["__str__", "user_id", "menu_id","is_active"]

    class Meta:
        Model = AuthUserMenu
admin.site.register(AuthUserMenu, authUserMenu)

models.py

class AuthUserMenu(models.Model):   # USER VS MENU relation
    user = models.ForeignKey(AuthUser,on_delete=models.DO_NOTHING,blank=True, null=True)
    menu = models.ForeignKey(Menu,on_delete=models.DO_NOTHING,blank=True, null=True)
    is_active = models.BooleanField(default=False)

    class Meta:
        db_table = 'auth_user_menu'
        ordering     = ['user','menu','is_active']

    def __str__(self):
        # return self.id
        return str([self.user.username,'>>>>>>', self.menu.menu_name])

В моей панели администратора Django enter image description here

  • При фильтрации по имени пользователя нужно показывать только некоторые меню при определенном условии... Как я могу этого добиться?

  • Предположим, для имени пользователя отображается 4 меню. Но должно отображаться 2 меню. Это можно получить с помощью запросов к базе данных.

  • Вот как пользователь относится к меню

    .

enter image description here

Извините, но фильтры, которые вы применяете для админки, действительны только для того, как они будут выглядеть на панели администратора, они не будут настраивать свойства вашей модели, и для того, чтобы достичь этого, вам нужно создать фильтр, как например ...

user = self.get_object()
articles = Article.objects.filter(author_id)

Что-то вроде этого

Вам нужен некоторый JS для асинхронного вызова представления при каждом обновлении поля user и изменения опций в поле menu с ответом. Пакет django-autocomplete-light является популярным выбором именно для этого, особенно обновление значений поля из других полей актуально

forms.py

class AuthUserMenuForm(forms.ModelForm):

    class Meta:
        model = AuthUserMenu
        fields = '__all__'
        widgets = {
            'menu': autocomplete.ModelSelect2(
                url='menu-autocomplete',
                forward=['user']
            )
        }

views.py

class MenuAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = Menu.objects.all()
        user = self.forwarded.get('user', None)
        if user:
            # Not clear exactly what your filter would be here so left it but you have user available
            qs = qs.filter(...)
        return qs

urls.py

urlpatterns = [
    ...
    path('menu-autocomplete/', views.MenuAutocomplete.as_view(), name='menu-autocomplete'),
    ...
]
class AuthUserMenuAdmin(admin.ModelAdmin):
    form = AuthUserMenuForm
    list_display = ["__str__", "user_id", "menu_id", "is_active"]

admin.site.register(AuthUserMenu, AuthUserMenuAdmin)
Вернуться на верх