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