0

我創建了Custom User model in Django,並且您在下面看到我的models.py無法在Django中驗證自定義用戶模型

from django.core.exceptions import ObjectDoesNotExist 
from django.conf import settings 
from uuidfield import UUIDField 

class User(AbstractUser, Mixin): 
    objects = HiddenUserManager() 
    USERNAME_FIELD = 'username' 
    # REQUIRED_FIELDS = ['email', 'password'] 
    api_token = UUIDField(auto=True) 
    token_created_date = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     unique_together = ('email',) # must have unique email! 
     app_label = 'portal' 

    def api_token_reset(self): 
     self.api_token = UUIDField(auto=True) 

我也改變了我的settings.py文件,並添加這一行:

AUTH_USER_MODEL = 'portal.User'門戶網站是我的應用程序的名稱。

我已經創建了兩個superusers使用portal.user model,你可以下面的圖片中看到: enter image description here

問題是,當我進入我的username and password在我的索引登錄頁面,它不能對我進行身份驗證。創建模型後,我執行了所有migrations。爲什麼登錄頁面無法驗證我?

如果我註釋掉我的customer user model並刪除此行AUTH_USER_MODEL = 'portal.User',那麼我的登錄頁面能夠驗證我。任何想法,我哪裏錯了?

我的登錄視圖看起來是這樣的:

from django.contrib.auth.views import login 
from django.http import HttpResponseRedirect 

def login(request, **kwargs): 
    return login(request, **kwargs) 

誰能幫助我在這裏?

更新:混合類

class RequireStaffMixinView(RequireAuthMixinView): 
    # Override 1) ensure staff 
    # @method_decorator(staff_user_required) 
    def dispatch(self, *args, **kwargs): 
     if not self.request.user.is_staff: 
      raise PermissionDenied 
     return super(RequireAuthMixinView, self).dispatch(*args, **kwargs 
+0

你可以發佈你的視圖哪裏有邏輯代碼來處理認證,像'authenticate'方法,請嗎? –

+0

'user.is_authenticated'正在工作,但我的用戶應該是'超級用戶'來訪問下一頁。查看我正在使用的'mixin'類,以確保用戶始終是'超級用戶'來訪問下一頁或者提高'權限被拒絕' – python

+0

在用戶模型中混用的是什麼? – utkbansal

回答

1

要創建一個自定義的用戶模型,所推薦的Django文檔擴展AbstractBaseUser模型,並添加自定義字段它。另請注意,由於Django的動態依賴項功能對可交換模型的限制,您必須確保AUTH_USER_MODEL引用的模型是在其應用程序的第一次遷移(通常稱爲0001_initial)中創建的;否則,你將有依賴性問題。

models.py

import uuid 

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


class CustomUserManager(BaseUserManager): 
    def create_user(self, email, password, **kwargs): 
     if not email or not password: 
      raise ValueError('User must have a username and password') 

     user = self.model(
      email=CustomUserManager.normalize_email(email), 
      **kwargs 
     ) 

     user.set_password(password) 
     user.save() 

     return user 

    def create_superuser(self, email, password, **kwargs): 
     user = self.create_user(email, password, **kwargs) 

     user.is_admin = True 
     user.is_staff = True 
     user.save() 

     return user 


class User(AbstractBaseUser): 
    first_name = models.CharField(max_length=255, null=False) 
    last_name = models.CharField(max_length=255, null=False) 
    email = models.EmailField(null=False, unique=True) 
    is_active = models.BooleanField(default=True) 
    created_on = models.DateTimeField(auto_now_add=True) 
    updated_on = models.DateTimeField(auto_now=True) 
    is_staff = models.BooleanField(default=False) 

    # Add custom fields here 
    api_token = models.UUIDField(default=uuid.uuid4, editable=False) 
    token_created_date = models.DateTimeField(auto_now_add=True) 

    objects = CustomUserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['first_name', 'last_name'] 

    def get_full_name(self): 
     return self.first_name + " " + self.last_name 

    def get_short_name(self): 
     return self.first_name 

    def has_perm(self, perm, obj=None): 
     return self.is_staff 

    def has_module_perms(self, app_label): 
     return self.is_staff 

    def api_token_reset(self): 
     self.api_token = models.UUIDField(default=uuid.uuid4, editable=False) 

    class Meta: 
     ordering = ('created_on',) 
     db_table = 'users' 

    def __unicode__(self): 
     return self.get_full_name() 

而下面的代碼添加到您的settings.py。注意 - 測試儀是

AUTH_USER_MODEL = 'tester.User' 

現在運行以下命令我的應用程序的名稱 -

python manage.py makemigrations 
python manage.py migrate 

現在你應該可以登錄到admin界面沒有任何問題。

如果你想創建一個自定義登錄頁面,在視圖中檢查,如果用戶是管理員或不 -

views.py

from django.contrib.auth import authenticate, login 
from django.contrib.auth.forms import AuthenticationForm 
from django.core.urlresolvers import reverse_lazy 
from django.http import HttpResponseRedirect 
from django.views.generic import FormView 


class LoginView(FormView): 
    form_class = AuthenticationForm 
    template_name = 'login.html' 

    def form_valid(self, form): 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 
     user = authenticate(username=username, password=password) 

     # Check here if the user is an admin 
     if user is not None and user.is_active and user.is_staff: 
      login(self.request, user) 
      return HttpResponseRedirect(self.success_url) 
     else: 
      return self.form_invalid(form) 

的login.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Login</title> 
</head> 
<body> 
<form method="post"> 
    {% csrf_token %} 
    {{ form }} 
    <input type="submit" value="Submit"> 
</form> 
</body> 
</html> 

網址。py

from django.conf.urls import url 

from .views import LoginView 

urlpatterns = [ 
    url(r'^login/$', LoginView.as_view(), name='login'), 
] 
+0

感謝@Utkarsh這樣一個詳盡的答案。我會研究並接受。 – python

+0

@python是你的問題解決? – utkbansal

+0

我現在正在旅行,所以無法再花時間再次查看問題。我雖然給了你50分:)你的回答絕對是非常有幫助的 – python