Op de hoofdpagina van de beheerderssite waar geregistreerde modellen verschijnen, wil ik verschillende modellen verbergen die zijn geregistreerd bij de Django-beheerder.
Als ik deze direct uitschrijf, kan ik geen nieuwe records toevoegen omdat het nieuwe symbool “+” verdwijnt.
Hoe kan dit worden gedaan?
Antwoord 1, autoriteit 100%
Op basis van het antwoord van x0nixheb ik wat experimenten gedaan. Het lijkt alsof het retourneren van een leeg dictaat van get_model_perms
het model uitsluit van index.html, terwijl het je toch mogelijk maakt om instanties direct te bewerken.
class MyModelAdmin(admin.ModelAdmin):
def get_model_perms(self, request):
"""
Return empty perms dict thus hiding the model from admin index.
"""
return {}
admin.site.register(MyModel, MyModelAdmin)
Antwoord 2, autoriteit 32%
Voor Django 1.8 en hoger
Sinds Django 1.8 heeft ModelAdmin
een nieuwe methode genaamd has_module_permission()
die verantwoordelijk is voor het weergeven van een model in de beheerdersindex.
Om een model uit de beheerdersindex te verbergen, maakt u deze methode aan in uw klasse ModelAdmin
en retourneert u False
. Voorbeeld:
class MyModelAdmin(admin.ModelAdmin):
...
def has_module_permission(self, request):
return False
Antwoord 3, autoriteit 16%
Heb hetzelfde probleem, hier kwam ik op uit.
Zoals in de vorige oplossing – kopieer index.html van django naar uw /admin/index.html en pas het als volgt aan:
{% for model in app.models %}
{% if not model.perms.list_hide %}
<tr>
...
</tr>
{% endif %}
{% endfor %}
En maak een ModelAdmin-subklasse:
class HiddenModelAdmin(admin.ModelAdmin):
def get_model_perms(self, *args, **kwargs):
perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs)
perms['list_hide'] = True
return perms
Nu zal elk model dat is geregistreerd met de HiddenModelAdmin-subklasse niet verschijnen in de beheerderslijst, maar zal in detail beschikbaar zijn via het “plus”-symbool:
class MyModelAdmin(HiddenModelAdmin):
...
admin.site.register(MyModel, MyModelAdmin)
Antwoord 4
Vanaf Django 1.8.18heeft has_module_permission()
nog steeds een probleem. Dus in ons geval gebruikten we ook de get_model_perms()
. Evenzo moeten we het model alleen voor een specifieke gebruiker verbergen, maar de superuser
moet toegang hebben tot zijn indexitem.
class MyModelAdmin(admin.ModelAdmin):
def get_model_perms(self, request):
if not request.user.is_superuser:
return {}
return super(MyModelAdmin, self).get_model_perms(request)
admin.site.register(MyModel, MyModelAdmin)
Antwoord 5
Lelijke oplossing: overschrijvenadmin index sjabloon dwz kopieer index.html van django naar uw /admin/index.html en voeg zoiets als dit toe:
{% for for model in app.models %}
{% ifnotequal model.name "NameOfModelToHide" %}
...
6
Alleen niet zetten admin.site.register (MyModel, MyModelAdmin) in admin.py bijvoorbeeld. Registreer het model normaly.