김용식*_*김용식 2 python django django-models django-users
我在 Django 1.11 中创建了自定义 UserModel,我需要一个允许用户登录的函数\n我认为我的自定义用户模型与我的函数不兼容\n我该如何修复?
\n\n请参阅下图中的错误消息:
\n\n\n\n用户.models.py
\n\nfrom django.db import models\nfrom django.contrib.auth.models import AbstractBaseUser, BaseUserManager\nfrom apps.teams.models import Team\nimport uuid\n\nclass MyUserManager(BaseUserManager):\n def _create_user(self, username, password, **extra_kwargs):\n user = self.model(username=username, **extra_kwargs)\n user.set_password(password)\n user.save(using=self._db)\n return user\n\n def create_superuser(self, username, password, **extra_kwargs):\n extra_kwargs.setdefault(\'is_active\', True)\n extra_kwargs.setdefault(\'is_superuser\', True)\n extra_kwargs.setdefault(\'is_staff\', True)\n\n if extra_kwargs.get(\'is_superuser\', None) is not True:\n raise ValueError(\'\xea\xb4\x80\xeb\xa6\xac\xec\x9e\x90 \xea\xb6\x8c\xed\x95\x9c\xec\x9d\xb4 \xed\x95\x84\xec\x9a\x94\xed\x95\xa9\xeb\x8b\x88\xeb\x8b\xa4.\')\n\n return self._create_user(username, password, **extra_kwargs)\n\nclass MyUser(AbstractBaseUser):\n """\n \xec\x9c\xa0\xec\xa0\x80 \xeb\xaa\xa8\xeb\x8d\xb8\n """\n POSITION_TYPES = (\n (\'a\', \'\xeb\x8c\x80\xed\x91\x9c\'),\n (\'b\', \'\xed\x8c\x80\xec\x9e\xa5\'),\n (\'c\', \'\xea\xb3\xbc\xec\x9e\xa5\'),\n (\'d\', \'\xeb\x8c\x80\xeb\xa6\xac\'),\n (\'e\', \'\xec\xa3\xbc\xec\x9e\x84\'),\n (\'f\', \'\xec\x82\xac\xec\x9b\x90\'),\n (\'g\', \'\xec\x9d\xb8\xed\x84\xb4\'),\n )\n uid = models.UUIDField(\n primary_key=True,\n editable=False,\n default=uuid.uuid4,\n verbose_name=\'\xed\x8c\x80 \xea\xb3\xa0\xec\x9c\xa0 \xec\x95\x84\xec\x9d\xb4\xeb\x94\x94\'\n )\n username = models.CharField(\n max_length=20,\n unique=True,\n verbose_name=\'\xec\x95\x84\xec\x9d\xb4\xeb\x94\x94\'\n )\n name = models.CharField(\n max_length=10,\n verbose_name=\'\xec\x9d\xb4\xeb\xa6\x84\'\n )\n email = models.EmailField(\n verbose_name=\'\xec\x9d\xb4\xeb\xa9\x94\xec\x9d\xbc\'\n )\n team = models.ForeignKey(\n Team,\n verbose_name=\'\xec\x86\x8c\xec\x86\x8d\',\n null=True,\n blank=True\n )\n position = models.CharField(\n max_length=2,\n choices=POSITION_TYPES,\n default=\'g\',\n verbose_name=\'\xec\xa7\x81\xea\xb8\x89\'\n )\n birth = models.DateField(\n null=True,\n blank=True,\n verbose_name=\'\xec\x83\x9d\xec\x9d\xbc\'\n )\n date_joined = models.DateField(\n null=True,\n blank=True,\n verbose_name=\'\xec\x9e\x85\xec\x82\xac\xec\x9d\xbc\'\n )\n date_exited = models.DateField(\n null=True,\n blank=True,\n verbose_name=\'\xed\x87\xb4\xec\x82\xac\xec\x9d\xbc\'\n )\n is_superuser = models.BooleanField(\n default=False,\n verbose_name=\'\xea\xb4\x80\xeb\xa6\xac\xec\x9e\x90 \xec\x97\xac\xeb\xb6\x80\'\n )\n is_staff = models.BooleanField(\n default=False,\n verbose_name=\'\xec\x8a\xa4\xed\x83\x9c\xeb\xb8\x8c \xec\x97\xac\xeb\xb6\x80\'\n )\n is_active = models.BooleanField(\n default=False,\n verbose_name=\'\xed\x99\x9c\xec\x84\xb1\xed\x99\x94 \xec\x97\xac\xeb\xb6\x80\'\n )\n\n objects = MyUserManager()\n\n USERNAME_FIELD = \'username\'\n\n\n class Meta:\n db_table = \'users\'\n\n def __str__(self):\n return self.username\n\n def get_full_name(self):\n return self.username\n\n def get_short_name(self):\n return self.username\n\n def has_perm(self, perm, obj=None):\n return True\n\n def has_module_perms(self, module):\n return True\nRun Code Online (Sandbox Code Playgroud)\n\n用户.forms.py
\n\nfrom django import forms\nfrom django.contrib.auth.forms import UserCreationForm, AuthenticationForm\nfrom .models import MyUser\nfrom apps.teams.models import Team\n\n\nclass SignupFrom(UserCreationForm):\n POSITION_TYPES = (\n (\'a\', \'\xeb\x8c\x80\xed\x91\x9c\'),\n (\'b\', \'\xed\x8c\x80\xec\x9e\xa5\'),\n (\'c\', \'\xea\xb3\xbc\xec\x9e\xa5\'),\n (\'d\', \'\xeb\x8c\x80\xeb\xa6\xac\'),\n (\'e\', \'\xec\xa3\xbc\xec\x9e\x84\'),\n (\'f\', \'\xec\x82\xac\xec\x9b\x90\'),\n (\'g\', \'\xec\x9d\xb8\xed\x84\xb4\'),\n )\n\n username = forms.CharField(\n required=True,\n label="\xec\x95\x84\xec\x9d\xb4\xeb\x94\x94",\n widget=forms.TextInput(\n attrs={\n \'class\':\'form-control\',\n \'placeholder\': \'\xec\x95\x84\xec\x9d\xb4\xeb\x94\x94\',\n \'required\' : \'True\',\n }\n )\n )\n\n password1 = forms.CharField(\n required=True,\n label="\xed\x8c\xa8\xec\x8a\xa4\xec\x9b\x8c\xeb\x93\x9c",\n widget=forms.PasswordInput(\n attrs={\n \'class\': \'form-control\',\n \'placeholder\': \'\xed\x8c\xa8\xec\x8a\xa4\xec\x9b\x8c\xeb\x93\x9c\',\n \'required\' : \'True\'\n }\n )\n )\n\n password2 = forms.CharField(\n required=True,\n label="\xed\x8c\xa8\xec\x8a\xa4\xec\x9b\x8c\xeb\x93\x9c \xed\x99\x95\xec\x9d\xb8",\n widget=forms.PasswordInput(\n attrs={\n \'class\': \'form-control\',\n \'placeholder\': \'\xed\x8c\xa8\xec\x8a\xa4\xec\x9b\x8c\xeb\x93\x9c \xed\x99\x95\xec\x9d\xb8\',\n \'required\': \'True\'\n }\n )\n )\n\n name = forms.CharField(\n required=True,\n label="\xec\x9d\xb4\xeb\xa6\x84",\n widget=forms.TextInput(\n attrs={\n \'class\': \'form-control\',\n \'placeholder\': \'\xec\x95\x84\xec\x9d\xb4\xeb\x94\x94\',\n \'required\': \'True\',\n }\n )\n )\n email = forms.EmailField(\n\n required=False,\n label="\xec\x9d\xb4\xeb\xa9\x94\xec\x9d\xbc",\n widget=forms.EmailInput(\n attrs={\n \'class\': \'form-control\',\n \'placeholder\': \'\xec\x9d\xb4\xeb\xa9\x94\xec\x9d\xbc\',\n \'required\': \'True\',\n }\n )\n )\n team = forms.ModelChoiceField(\n required=True,\n label="\xec\x86\x8c\xec\x86\x8d",\n queryset=Team.objects.all(),\n widget=forms.Select(\n attrs={\n \'class\': \'form-control\',\n }\n )\n )\n\n position = forms.ChoiceField(\n required=False,\n label="\xec\xa7\x81\xea\xb8\x89",\n choices=POSITION_TYPES,\n widget=forms.Select(\n attrs={\n \'class\': \'form-control\',\n \'required\' : \'True\',\n }\n )\n\n )\n birth = forms.DateField(\n label="\xec\x83\x9d\xec\x9d\xbc",\n widget=forms.DateInput(\n attrs={\n \'class\': \'form-control\',\n \'required\': \'True\',\n }\n )\n )\n date_joined = forms.DateField(\n required=True,\n label="\xec\x9e\x85\xec\x82\xac\xec\x9d\xbc",\n widget=forms.DateInput(\n attrs={\n \'class\': \'form-control\',\n \'required\': \'True\',\n }\n )\n )\n\n class Meata:\n model = MyUser\n fields = ("username", "name", "password1", "password2", "team", "position", "email", "birth", "date_joined")\n\n\nclass LoginForm(AuthenticationForm):\n username = forms.CharField(\n max_length=10,\n widget=forms.TextInput(\n attrs={\n \'class\': \'form-control\',\n \'placeholder\': \'\xec\x95\x84\xec\x9d\xb4\xeb\x94\x94\',\n \'required\': \'True\',\n }\n )\n )\n password = forms.CharField(\n widget=forms.PasswordInput(\n attrs={\n \'class\': \'form-control\',\n \'placeholder\': \'\xed\x8c\xa8\xec\x8a\xa4\xec\x9b\x8c\xeb\x93\x9c\',\n \'required\': \'True\',\n }\n )\n )\nRun Code Online (Sandbox Code Playgroud)\n\n用户视图.py
\n\nfrom django.shortcuts import render\nfrom django.http import HttpResponseRedirect\nfrom django.core.urlresolvers import reverse\n\nfrom .forms import SignupFrom\n\n\ndef signup(request):\n signupform = SignupFrom()\n if request.method == \'POST\':\n signupform = SignupFrom(request.POST)\n if signupform.is_valid():\n user = signupform.save(commit=False)\n user.save()\n return HttpResponseRedirect(\n reverse("sign_ok")\n )\n return render(request, "registration/signup.html", {"signupform": signupform})\nRun Code Online (Sandbox Code Playgroud)\n\n我设置了settings.py AUTH_USER_MODEL = \'users.MyUSer\'
\n您已创建自定义用户。将其添加到 models.py、views.py、forms.py-
from django.contrib.auth import get_user_model
User = get_user_model()
Run Code Online (Sandbox Code Playgroud)