Как я могу настроить фильтрацию в 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

При фильтрации по имени пользователя нужно показывать только некоторые меню при определенном условии... Как я могу этого добиться?
Предположим, для имени пользователя отображается 4 меню. Но должно отображаться 2 меню. Это можно получить с помощью запросов к базе данных.
Вот как пользователь относится к меню
.
Извините, но фильтры, которые вы применяете для админки, действительны только для того, как они будут выглядеть на панели администратора, они не будут настраивать свойства вашей модели, и для того, чтобы достичь этого, вам нужно создать фильтр, как например ...
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)
