【问题标题】:django create abstractbaseuser model, errordjango创建abstractbaseuser模型,错误
【发布时间】:2020-06-02 07:34:18
【问题描述】:

我正在制作我的个人项目。 我正在尝试编码注册功能。但不工作。 createuser 做得对。但是当我运行服务器并转到 signup.html 页面时,输入值总是相同的错误。我的代码有什么问题?

模型.py

from django.contrib.auth.models import(BaseUserManager, AbstractBaseUser, PermissionsMixin)
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.utils.translation import ugettext_lazy as _

class UserManager(BaseUserManager):
    use_in_migrations = True
    def create_user(self, username, userid, company, companycode, password=None):

        if not username:
            raise ValueError(_('Users must have an name!'))

        user = self.User(
            username=username,
            userid = userid,
            company= company,
            companycode = companycode,
        )

        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, username, userid, company, companycode, password):
        user = self.create_user(
            username=username,
            userid = userid,
            company = company,
            companycode = companycode,
            password=password,
        )
        user.is_active = True
        user.is_superuser = True
        user.save()
        return user



class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=10, unique=True, verbose_name="이름")
    userid = models.CharField(max_length=100, unique=True, verbose_name="아이디")
    company = models.CharField(max_length=10, verbose_name="회사")
    companycode = models.CharField(max_length=100, verbose_name="회사코드")
    created_date = models.DateTimeField(auto_now_add=True, verbose_name="생성날짜")
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = 'user'

    objects = UserManager()
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['userid', 'company', 'companycode']
    def __str__(self):
        return self.username

    def get_full_name(self):
        return self.username

    def get_short_name(self):
        return self.username

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All superusers are staff
        return self.is_superuser

    get_full_name.short_description = _('Full name')

views.py

from django.shortcuts import render
from django.http.response import HttpResponseRedirect
from django.urls.base import reverse
from django.contrib.auth.models import User, UserManager
from django.http import HttpResponse

from django.shortcuts import render
from .models import UserManager


def signup(request):
    if request.method == 'GET':
        return render(request, 'useraccount/signup.html')

def signup_sign(request):
    if request.method == 'POST':
        username = request.POST['name']
        userid = request.POST['id']
        company = request.POST['company']
        code = request.POST['code']
        account = UserManager.create_user(
            username=username,
            userid = userid,
            company = company,
            companycode = code,
        )
        account.save()
        return render(request, 'useraccount/success.html')

signup.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form name="test" action="/signup_sign/" method="post"> {% csrf_token %}
        NAME : <input type="text" name="name" > </br>
        ID : <input type="text" name="id" > </br>
        COMPANY: <input type="text" name="company"> </br>
        CODE: <input type="password" name="code"> </br>
        <input type="submit" value="send">
    </form>
</body>

</html>

基本上基本用户需要电子邮件、姓名、姓氏、名字等。 但我只想输入姓名、身份证、公司名称、公司代码。 所以我使用 AbstractBaseUser 创建了新模型。

但总是出现此错误。 错误。

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/signup_sign/

Django Version: 3.0.6
Python Version: 3.7.7
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'useraccount']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/junbeomkwak/Desktop/fido_project/useraccount/views.py", line 25, in signup_sign
    companycode = code,

Exception Type: TypeError at /signup_sign/
Exception Value: create_user() missing 1 required positional argument: 'self'

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    在你的views.py中,这一行是不正确的:

      account = UserManager.create_user(
          username=username,
          userid = userid,
          company = company,
          companycode = code,
      )
    

    你应该使用User.objects.create_user:

      account = User.objects.create_user(
          username=username,
          userid = userid,
          company = company,
          companycode = code,
      )
    

    确保在文件顶部包含from .models import User

    你的代码不起作用的原因是因为create_user不是一个静态方法,所以它只能从UserManager的一个实例中调用,而不是它的类。 User 有一个 UserManager 的实例,由这个 sn-p 创建:objects = UserManager()

    【讨论】:

    • 另外,最好将您的用户模型称为 MyUser 之类的独特名称,以避免您的 IDE 产生混淆或不正确的导入。
    【解决方案2】:

    但是 object = models.Manager() 和 models.Manager() 没有任何方法“create_user()”,那么我们应该怎么做呢? create-user() 方法不支持文档中超过 4 个字段。

    【讨论】:

    • 欢迎来到 SO!这真的是一个答案还是一个评论?如果是评论,请删除。
    猜你喜欢
    • 2023-03-29
    • 2011-01-09
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多