2016-05-25 8 views
1

Ich möchte die Admin-Benutzer nur die Modell Instanzen sehen, die sie erstellt haben. Ich folgte diesen Anweisungen Filter django admin by logged in userFilter django admin von angemeldeten Benutzer (Foreign Key zeigt)

class FilterUserAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     if getattr(obj, 'user', None) is None: #Assign user only the first time, superusers can edit without changing user 
      obj.user = request.user 
     obj.save() 
    def queryset(self, request): 
     qs = super(FilterUserAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(user=request.user) 
    def has_change_permission(self, request, obj=None): 
     if not obj: 
      # the changelist itself 
      print('query change') 
      return True # So they can see the change list page 
     return obj.user == request.user or request.user.is_superuser 


class CampaignAdmin(FilterUserAdmin): 
    ... 

So sieht mein Code aus. Alles funktioniert gut. Ich brauche ein weiteres Modell mit Kampagne als Fremdschlüssel.

class ScreenAdmin(FilterUserAdmin): 
    ... 

admin.site.register(Campaign,CampaignAdmin) 
admin.site.register(Screen,ScreenAdmin) 

jetzt, wenn ich gehe zu Bildschirme, und ich sehe, von anderen Benutzern erstellte Kampagnen zur Auswahl

Ich will nicht Kampagnen von anderen Benutzer in der Lage sein werden, ausgewählt

aktualisieren: Dies ist meine aktuelle get_form

class ScreenAdmin(FilterUserAdmin): 
    list_display = ('screen_name', 'id','screen_URL') 
    def get_form(self, request, obj=None, **kwargs): 
     self.exclude = ["beacon"] 
     if not request.user.is_superuser: 
      self.exclude.append('user') #here! 
     form = super(ScreenAdmin, self).get_form(request, obj, **kwargs) 
     #print(vars(form)) 
     form.base_fields['campaign'].queryset = Campaign.objects.filter(user=request.user) 
     return form 
    def changelist_view(self, request, extra_context=None): 
    if request.user.is_superuser: 
     self.list_display = ('screen_name','user', 'id','screen_URL') 
    #print('Change List######') 
    return super(ScreenAdmin, self).changelist_view(request, extra_context) 

Antwort

0

diese Lösung perfekt ist s ane und Arbeits

def queryset(self, request): 
    qs = super(FilterUserAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    return qs.filter(user=request.user) 

es sei denn, Sie als Superuser markiert sind, ist eine dieser wahrscheinlich das, was Sie tun.

Zugriff auf das Admin-Interface zu haben, müssen Sie Benutzer überprüfen als „Personal“ (is_staff)

, wenn Sie „Super-User“ überprüfen Sie alle Daten sehen, so erstellen anderen Benutzer (für die Tests) füge ihm die richtigen Rechte hinzu, aber markiere mim nicht als Superuser, nur is_staff und teste es.

+0

Das ist absichtlich. Ich sehe das gleiche Verhalten, das Personal und nicht Superuser ist, was ein Problem ist. –