2016-04-13 53 views
0

我已經定製了用戶模型,這是模型:AttributeError的:「帳戶」對象有沒有屬性「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() 

然後當我試圖把它拋出AttributeError: 'Account' object has no attribute 'is_staff'所有用戶的列表。

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

你還沒有在你的模型上罰款一個'is_staff'字段。你打算? –

回答

0

問題解決了定義自己的權限後:

class IsAdminUser(permissions.BasePermission): 

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

然後

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

如果您決定創建自己的'IsAdminUser',那麼您可能只想'返回request.user.is_admin',因爲如果用戶不是可能導致意外結果的管理員,則不會返回任何結果。 – Sayse

+0

謝謝,編輯了答案。 – pyprism

2

IsAdminUser電話is_staff這是對Django的權威性用戶模型中定義。所以,如果你有自己的自定義用戶模型,您需要提供一個實現,這也

在Django的AbstractUser類,它是一個BooleanField,你可以看到here

0

由於@Sayse和@Daniel指出,就可以解決這個問題,添加is_staff firld您的自定義用戶模型:

is_staff = models.BooleanField(_( '員工狀態'),默認= FALSE)

(這爲我工作)

相關問題