Question

Je veux fournir une vue personnalisée dans l'admin très similaire à changelist_view(), mais sans les liens à la vue formulaire de modification. Les utilisateurs seront en mesure de sélectionner les éléments dans la liste et appliquer des actions comme dans la forme de liste de changement, mais ils ne seront pas avoir accès au formulaire d'édition.

Je pense que la structure de la classe ModelAdmin devrait ressembler à ceci:

class ProductAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(ProductAdmin, self).get_urls()
        urls += patterns('',
            (r'^selectlist/$', self.selectlist_view)
        )
        return urls

    def selectlist_view(self):
        return render_to_response(...)

La vue de restituer est très similaire à ModelAdmin.changelist_view(). Quel est le meilleur et DRY façon de le faire?

Était-ce utile?

La solution

Le ModelAdmin personnalisé suivant est la meilleure solution que je pouvais venir avec à ce jour:

class UserModelAdmin(ModelAdmin):
    def get_urls(self):
        urls = super(UserModelAdmin, self).get_urls()
        info = self.model._meta.app_label, self.model._meta.module_name
        select_list_url = patterns('',
            url(r'^selectlist/$', self.selectlist_view, 
                name='%s_%s_select' % info)
        )
        return select_list_url + urls

    def selectlist_view(self, request, extra_context=None):
        temp_list_display_links = self.list_display_links
        self.list_display_links = (None, )
        response = self.changelist_view(request, extra_context)
        self.list_display_links = temp_list_display_links
        return response

Autres conseils

Je ne sais pas vraiment pourquoi, mais personnellement, je tends à override (ou prolonger) la liste des modifications modèle pour un modèle particulier au lieu de monkeypatching ModelAdmin.

ÉDITÉ:

  

Merci, mais je personnalisation de besoin qui ne peut être fait simplement en remplaçant le modèle. par exemple l'affichage d'un queryset différent, etc.

Pour afficher un autre queryset vous pouvez overrride ModelAdmin.queryset ().

  

aussi ne devrait pas être en mesure de modifier les éléments énumérés. si je passer outre le modèle, l'utilisateur ne verra pas un lien vers le formulaire de modification, mais il peut encore accéder au formulaire et de le modifier en tapant l'url s'il peut deviner l'URL pour la forme, ce qui serait un trou de sécurité.

Pourquoi ne pas simplement supprimer l'autorisation de modifier des utilisateurs en question? Vous pouvez remplacer les vues « ajouter » et « changement », ainsi:

class SomeModelAdmin(admin.ModelAdmin):
    ...
    def change_view(self, request, object_id, extra_context=None):
        return render_to_response('forbiden_operation.html', dict(op='edit'))
    def ModelAdmin.add_view(self, request, form_url='', extra_context=None):
        return render_to_response('forbiden_operation.html', dict(op='add'))

Ce sont des crochets « officiels », moins susceptibles de se briser à l'avenir.

Souvenez-vous également "The Zen of Admin":

  

À la base, l'interface d'administration de Django est conçu pour une seule activité:

     
    

Les utilisateurs de confiance édition de contenu structuré.

  
     

Oui, il est extrêmement simple - mais que la simplicité est basée sur toute une série d'hypothèses. Toute la philosophie de l'interface d'administration de Django découle directement de ces hypothèses, donc nous allons creuser dans le sous-texte de cette phrase dans les sections qui suivent.   « Utilisateurs de confiance ... »

     

L'interface d'administration est conçu pour être utilisé par des personnes que vous, le développeur, la confiance. Cela ne signifie pas seulement « les gens qui ont été authentifiées »; cela signifie que Django suppose que vos éditeurs de contenu peuvent faire confiance pour faire la bonne chose.

     

dans des moyens de tour qu'il n'y a pas de processus d'approbation pour l'édition de contenu - si vous faites confiance à vos utilisateurs, personne ne doit approuver leurs modifications. Une autre conséquence est que le système d'autorisation, tout puissant, n'a pas de support pour limiter l'accès sur une base par objet de cette écriture. Si vous faites confiance à quelqu'un pour modifier ses propres histoires, vous faites confiance à l'utilisateur de ne pas modifier les histoires de quelqu'un d'autre sans autorisation.

     
    

« ... l'édition ... »

  
     

Le but principal de l'interface d'administration de Django est de laisser les gens modifier des données. Cela semble évident au premier abord, mais encore une fois il a des répercussions subtiles et puissantes.

     

Par exemple, bien que l'interface d'administration est très utile pour l'examen des données (comme décrit ci-), il n'est pas conçu à cet effet à l'esprit. Par exemple, noter l'absence d'autorisation « peut voir » (voir le chapitre 12). Django suppose que si les gens sont autorisés à afficher le contenu dans l'interface d'administration, ils sont également autorisés à le modifier.

     

Une autre chose importante à noter est le manque de quoi que ce soit à distance même approche « flux de travail ». Si une tâche donnée nécessite une série d'étapes, il n'y a pas de support pour l'application que ces mesures soient effectuées dans un ordre particulier. L'interface d'administration de Django se concentre sur l'édition, et non sur les activités entourant l'édition. Cet évitement du flux de travail découle également du principe de confiance. La philosophie de l'interface d'administration est ce flux de travail est une question de personnel, pas quelque chose à être mis en œuvre dans le code

     

Enfin, notez l'absence d'agrégation dans l'interface d'administration. Autrement dit, il n'y a pas de support pour l'affichage des totaux, des moyennes, et ainsi de suite. Encore une fois, l'interface d'administration est pour l'édition -. Il est prévu que vous allez écrire des vues personnalisées pour tout le reste

     
    

« ... contenu structuré »

  
     

Comme le reste de Django, l'interface d'administration vous souhaite travailler avec des données structurées. Ainsi, il ne supporte que les données stockées dans l'édition de modèles Django; pour quoi que ce soit d'autre, telles que les données stockées sur un système de fichiers, vous aurez besoin d'affichage personnalisés.

     
    

Full Stop

  
     

Il doit être clair maintenant que l'interface d'administration de Django ne pas essayer d'être tout pour tout le monde; à la place, nous choisissons de se concentrer étroitement sur une chose et cette chose extrêmement bien.

     

Quand il vient à l'extension de l'interface d'administration de Django, une grande partie de cette même philosophie tient (note que « » apparaît extensibilité nulle part dans nos objectifs). Parce que vues personnalisées Django peut faire quoi que ce soit, et parce qu'ils peuvent facilement être visuellement intégrés dans l'interface d'administration (tel que décrit dans la section suivante), intégré dans les possibilités de personnalisation de l'interface d'administration sont quelque peu limités par leur conception.

     

Vous devez garder à l'esprit que l'interface d'administration est « juste une application, » quoique très compliqué. Il ne fait rien que tout développeur Django avec suffisamment de temps ne pouvait pas se reproduire. Il est tout à fait possible que dans l'avenir quelqu'un développera une interface d'administration différente qui repose sur un ensemble d'hypothèses différentes et donc se comporter différemment.

     

Enfin, il convient de souligner que, de cette écriture, les développeurs de Django ont travaillé sur une nouvelle version de l'interface d'administration qui permet une plus grande flexibilité dans la personnalisation. Au moment où vous lirez ces lignes, ces nouvelles fonctionnalités peuvent avoir fait leur chemin dans la bonne foi de distribution Django. Pour le savoir, demandez à quelqu'un dans la communauté Django si la branche « newforms-admin » a été intégré.

L'application admin a vu beaucoup d'amélioration afin de permettre une plus grande flexibilité dans la personnalisation, mais à mon humble avis une grande partie de « The Zen of Admin » est toujours vrai.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top