2016-04-13 8 views
0

Ich habe Benutzermodell angepasst, Hier ist das Modell:Attribute: ‚Konto‘ Objekt hat kein Attribut ‚is_staff‘

from django.db import models 
from django.contrib.auth.models import AbstractBaseUser 
from django.contrib.auth.models import BaseUserManager 


class AccountManager(BaseUserManager): 

    def create_user(self, username=None, password=None, **kwargs): 
     account = self.model(username=username) 

     account.set_password(password) 
     account.is_stuff = False 
     account.save() 

     return account 

    def create_superuser(self, username, password, **kwargs): 
     account = self.create_user(username, password, **kwargs) 
     account.is_admin = True 
     account.is_staff = True 
     account.save() 

     return account 


class Account(AbstractBaseUser): 
    username = models.CharField(max_length=40, unique=True) 
    is_admin = models.BooleanField(default=False) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
    initialized = models.BooleanField(default=False) 

    USERNAME_FIELD = 'username' 

    objects = AccountManager() 

dann, wenn ich versuche Liste aller Benutzer es AttributeError: 'Account' object has no attribute 'is_staff' wirft zu bekommen.

class GetUserList(ListAPIView): 
    permission_classes = (permissions.IsAdminUser,) 
    queryset = Account.objects.all() 
    serializer_class = AccountSerializer 
+0

Sie haben nicht de Geldstrafe ein 'is_staff'-Feld auf Ihrem Modell. Hast du vor? –

Antwort

0

Gelöst ist das Problem nach eigener Erlaubnis definieren:

class IsAdminUser(permissions.BasePermission): 

    def has_permission(self, request, view): 
     return request.user.is_admin 

Dann

class GetUserList(ListAPIView): 
    permission_classes = (IsAdminUser,) 
    queryset = Account.objects.all() 
    serializer_class = AccountSerializer 
+1

Wenn Sie sich dazu entschließen, Ihren eigenen 'IsAdminUser' zu erstellen, können Sie einfach' request.user.is_admin' zurückgeben, da nichts zurückgegeben wird, wenn der Benutzer kein Administrator ist, was zu unerwarteten Ergebnissen führen kann. – Sayse

+0

danke, bearbeitet die Antwort. – pyprism

2

IsAdminUser Anrufe is_staff, die auf Djangos Auth Benutzermodell definiert ist. Also, wenn Sie Ihre eigenen Benutzermodell haben, müssen Sie eine Implementierung dieser auch AbstractUser

In Djangos Klasse zur Verfügung zu stellen, ist es eine BooleanField, wie Sie here sehen

0

Wie @Sayse und @ Daniel wies darauf hin, Sie können dieses Problem Hinzufügen der is_staff firld Ihrem benutzerdefinierten Benutzermodell lösen:

is_staff = models.BooleanField (_ ('Personal-Status'), default = false)

(das ist für mich gearbeitet hat)

Verwandte Themen