首页 > 解决方案 > 获取错误“函数”对象没有属性“_meta”django 2.0

问题描述

尝试使用 AbstractUserModel 对 Django 自定义用户使用登录和注册现在在 makemigrations 期间出现此错误我使用的是 Django 2.0.7 和 python 3.6.6

模型.py

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


class UserManager(BaseUserManager):
    def create_user(self,email,full_name,password=None,is_active = 
        True,is_staff=False,is_admin=False): 

    if not email:
            raise ValueError("Put an email address")
    if not password:
            raise ValueError("Input a password")
    if not full_name:
            raise ValueError("You must add your fullname")
    user= self.model(
            email=self.normalize_email(email),
    fullname=full_name
    )
   user.set_password(password)
   user.staff = is_staff
   user.admin = is_admin
   user.active = is_active
   user.save(using=self._db)
   return user

   def create_staffuser(self,email,full_name,password=None):
        user = self.create_user(
            email,
            full_name=full_name,
            password=password,
            is_staff=True
            )
        return user

   def create_superuser(self,email,full_name=None,password=None):
        user = self.create_user(
        email,
        full_name=full_name,
        password=password,
        is_staff=True,
        is_admin=True
        )
    return user  


class User(AbstractBaseUser):
    email      = models.EmailField(max_length=50,unique=True)
    full_name  = models.CharField(max_length=200,blank=True
    active     = models.BooleanField(default=True)
    staff      = models.BooleanField(default=False)
    admin      = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name']
    objects = UserManager()

def __str__(self):
    return self.email

def get_full_name(self):
    if self.full_name:
        return self.full_name
    return self.email


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

def has_module_perms(self, app_level):
    return True



   @property
   def is_staff(self):
       return self.staff


   @property
   def is_admin(self):
       return self.admin


   @property
   def is_active(self):
          return self.active

表格.py

from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from .models import User


User = get_user_model



class UserAdminChangeForm(forms.ModelForm):


password = ReadOnlyPasswordHashField()

class Meta:
    model  = User
    fields = ('email', 'full_name','password', 'active', 'admin')

def clean_password(self):
    # Regardless of what the user provides, return the initial value.
    # This is done here, rather than on the field, because the
    # field does not have access to the initial value
    return self.initial["password"]


class LoginForm(forms.Form):
email    = forms.EmailField(label='email')
password = forms.CharField(widget=forms.PasswordInput)





class RegisterForm(forms.ModelForm):
"""A form for creating new users. Includes all the required
fields, plus a repeated password."""
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', 
widget=forms.PasswordInput)

class Meta:
    model = User
    fields = ('email','full_name',)

def clean_password2(self):
    # Check that the two password entries match
    password1 = self.cleaned_data.get("password1")
    password2 = self.cleaned_data.get("password2")
    if password1 and password2 and password1 != password2:
        raise forms.ValidationError("Passwords don't match")
    return password2

def save(self, commit=True):
    # Save the provided password in hashed format
    user = super(RegisterForm, self).save(commit=False)
    user.set_password(self.cleaned_data["password1"])
    user.active = True #send confirmation email
    if commit:
        user.save()
    return user

视图.py

from django.shortcuts import render, redirect
from django.views.generic import CreateView, FormView
from django.http import HttpResponse
from .forms import RegisterForm,LoginForm
from django.contrib.auth import authenticate,get_user_model,login
from django.utils.http import is_safe_url
# from django.contrib.auth.models import User
# from django.contrib.auth.decorators import login_required




# Create your views here.

class LoginView(FormView):
form_class = LoginForm
template_name = 'login.html'
success_url = '/'        #will be the profile view

def form_valid(self):
    request = self.request
    next_ = request.GET.get('next')
    next_post = request.POST.get('next')
    redirect_path = next_ or next_post or None
    email = form.cleaned_data.get('email')
    password = form.cleaned_data.get('password')
    user = authenticate(username=email, password=password)
    if user is not None:
        login(request, user)
        try:
            del request.session[]
        except:
            pass
        if is_safe_url(redirect_path, request.get_host()):
            return redirect(redirect_path)
        else:
            return redirect("/")
    return super(LoginView,self).form_invalid()


class RegisterView(CreateView):
form_class = RegisterForm
template_name = 'registratiion.html'
success_url = '/login/'

如果我发布了任何不必要的内容,我很抱歉...
如果您有更好的解决方案,请帮助我...

标签: pythondjangodjango-modelsdjango-forms

解决方案


您错过了调用该get_user_model方法的括号。它应该是:

from django.contrib.auth import get_user_model

User = get_user_model()

推荐阅读