Cette question est liée à my other question mais j'ai un peu changé la logique.Django: Paramètres de filtre complexes ou ...?
J'ai modèles comme ceci:
from django.contrib.auth.models import Group
class Category(models.Model):
(...)
editors = ForeignKey(Group)
class Entry(models.Model):
(...)
category = ForeignKey(Category)
Maintenant, disons que les journaux de l'utilisateur dans le panneau d'administration et veut changer une entrée. Comment puis-je limiter la liste des entrées à ceux, il a le droit de modifier? Je veux dire: Comment puis-je lister uniquement les Entrées affectées à une Catégorie qui, dans son champ "éditeurs", a un des groupes auxquels appartient l'Utilisateur?
Que faire si l'utilisateur appartient à plusieurs groupes? J'ai encore besoin de montrer toutes les entrées pertinentes.
J'ai essayé d'expérimenter avec les méthodes changelist_view() et queryset() mais ce problème est un peu trop complexe pour moi.
Je me demande également si granular-permissions pourrait m'aider avec la tâche, mais pour l'instant je n'ai aucune idée.
Je suis arrivé seulement avec ceci: D'abord, j'ai la liste de tous les groupes auxquels appartient l'utilisateur. Ensuite, pour chaque groupe, je reçois toutes les catégories connectées, puis pour chaque catégorie, j'obtiens toutes les entrées qui appartiennent à ces catégories. Malheureusement, je n'ai aucune idée de comment assembler tout ensemble en tant que paramètres filter() pour produire un simple QuerySet simple.
EDIT:
J'ai essayé d'utiliser MultiQuerySet comme ceci:
class EntryAdmin(admin.ModelAdmin):
(...)
def queryset(self, request):
qs = super(EntryAdmin, self).queryset(request)
if not request.user.is_superuser:
groups = request.user.groups.all()
list = []
for group in groups:
categories = Category.objects.filter(editors=group)
for category in categories:
results = qs.filter(category=category)
list.append(results)
qs = MultiQuerySet(*list)
return qs
mais je reçois une erreur de base de données dans la vue admin (pas une erreur Django, page d'administration normale est affiché, mais au lieu d'un liste il y a "erreur de base de données")
Ohmigod, ça a fait l'affaire! J'ai utilisé ceci: qs = qs.filter (category__in = Category.objects.filter (editors__in = request.user.groups.all())) MERCI! – minder