Django-beheerder, verberg een model

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_permshet 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 ModelAdmineen 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 ModelAdminen 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 superusermoet 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.

Other episodes