2009-09-04 4 views
0

J'ai un tel modèle nommé Foo:Restriction d'entrée du modèle d'administration

class Foo(models.Model): 
    name = models.CharField() 
    entry = models.DateField() 

J'ai 2 types d'utilisateurs qui peuvent se connecter au panneau d'administration, réguliers et superutilisateurs. Je souhaite interdire l'édition/la suppression des entrées Foo de plus de 2 jours (en utilisant le champ de date d'entrée), mais les superutilisateurs peuvent éditer sans restriction. Comment puis-je y parvenir? Merci

Répondre

5

Override de queryset and has_change_permission ModelAdmin:

from django.contrib.admin import ModelAdmin 

class FooAdmin(ModelAdmin): 
    def has_change_permission(self, request, obj): 
     return obj is None or self.queryset(request).filter(pk=obj.pk).count() > 0 

    def queryset(self, request): 
     query = super(FooAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return query 
     else: 
      from datetime import datetime, timedelta 

      return query.filter(entry__gt=datetime.now()-timedelta(days=2)) 

admin.site.register(Foo, FooAdmin) 

has_change_permission est utilisé par la vue du changement et queryset par la vue de la liste. Je réutilise le jeu de requête à l'intérieur du has_change_permission substitué pour rester DRY (vous pouvez donc ajouter des filtres supplémentaires dans queryset sans vous soucier d'ajouter cette logique dans la vérification des permissions), mais cela vaut la peine de mentionner une requête supplémentaire.

+0

merci beaucoup pour le snipplet, vous m'a sauvé :)! – Hellnar

+1

la méthode a été renommée 'get_queryset' dans django 1.6+ –

Questions connexes