103 votes

Modèles en lecture seule dans l'interface d'administration de Django ?

Comment puis-je rendre un modèle complètement en lecture seule dans l'interface d'administration? Il s'agit d'un type de table de journal, où j'utilise les fonctionnalités d'administration pour rechercher, trier, filtrer, etc., mais il n'est pas nécessaire de modifier le journal.

Si cela semble être un doublon, voici ce que je n'essaie pas de faire:

  • Je ne cherche pas des champs en lecture seule (même rendre chaque champ en lecture seule permettrait toujours de créer de nouveaux enregistrements)
  • Je ne cherche pas à créer un utilisateur en lecture seule: chaque utilisateur devrait être en lecture seule.

11voto

Iván Zugnoni Points 119

En fait, vous pouvez essayer cette solution simple:

class ReadOnlyModelAdmin(admin.ModelAdmin):
    actions = None
    list_display_links = None
    # more stuff here

    def has_add_permission(self, request):
        return False
  • actions = None: évite d'afficher le menu déroulant avec l'option "Supprimer la sélection..."
  • list_display_links = None: évite de cliquer dans les colonnes pour modifier cet objet
  • has_add_permission() retournant False évite de créer de nouveaux objets pour ce modèle

11voto

grrrrrr Points 513

Ceci a été ajouté à Django 2.1 qui a été publié le 8/1/18!

ModelAdmin.has_view_permission() est tout comme les has_delete_permission, has_change_permission et has_add_permission existants. Vous pouvez en apprendre davantage dans la documentation ici

À partir des notes de version :

Cela permet de donner aux utilisateurs un accès en lecture seule aux modèles dans l'admin. ModelAdmin.has_view_permission() est nouveau. La mise en œuvre est rétrocompatible en ce sens qu'il n'est pas nécessaire d'attribuer l'autorisation "view" pour permettre aux utilisateurs ayant l'autorisation "change" de modifier les objets.

6voto

Wouter Points 31

Si la réponse acceptée ne fonctionne pas pour vous, essayez ceci :

def get_readonly_fields(self, request, obj=None):
    readonly_fields = []
    for field in self.model._meta.fields:
        readonly_fields.append(field.name)

    return readonly_fields

6voto

Mark Chackerian Points 1562

En compilant les excellentes réponses de @darklow et @josir, tout en ajoutant un peu plus pour supprimer les boutons "Enregistrer" et "Enregistrer et continuer", on obtient (en syntaxe Python 3) :

class ReadOnlyAdmin(admin.ModelAdmin):
    """Fournit une vue en lecture seule d'un modèle dans l'administration Django."""
    readonly_fields = []

    def change_view(self, request, object_id, extra_context=None):
        """Personnaliser le formulaire d'ajout / modification pour supprimer les boutons enregistrer et enregistrer et continuer"""
        extra_context = extra_context or {}
        extra_context['show_save_and_continue'] = False
        extra_context['show_save'] = False
        return super().change_view(request, object_id, extra_context=extra_context)

    def get_actions(self, request):
        actions = super().get_actions(request)
        if 'delete_selected' in actions:
            del actions['delete_selected']
        return actions

    def get_readonly_fields(self, request, obj=None):
        return list(self.readonly_fields) + \
           [field.name for field in obj._meta.fields] + \
           [field.name for field in obj._meta.many_to_many]

    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

ensuite, vous l'utilisez comme ceci

class MyModelAdmin(ReadOnlyAdmin):
    pass

Je n'ai essayé ceci qu'avec Django 1.11 / Python 3.

4voto

Avec Django 2.2, je le fais comme ça :

@admin.register(MyModel)
class MyAdmin(admin.ModelAdmin):
    readonly_fields = ('all', 'the', 'necessary', 'fields')
    actions = None # Supprime l'action de suppression par défaut dans la vue de liste

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X