值错误:字段'id'期望一个数字,但得到'john.smith@gmail.com'



我正在尝试创建用于身份验证的自定义用户模型。我做的一切都和Django文档中的一样,但当我试图用命令行创建超级用户时,我得到了错误。我试图删除数据库和迁移,然后再次运行它们,但没有帮助。

这是我的型号。py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db.models.deletion import CASCADE
from django.utils import timezone
from django.utils.translation import gettext_lazy
# Create your models here.
class UserAccountManager(BaseUserManager):
def create_user(self, Email, Name, Surname, Password = None, **other_fields):

if not Email:
raise ValueError(gettext_lazy('You must provide email address'))
email = self.normalize_email(Email)
user = self.model(email, Name, Surname, **other_fields)
user.set_password(Password)
user.save(using=self._db)

return user
def create_superuser(self, Email, Name, Surname, Password = None, **other_fields):

other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_active', True)
return self.create_user(Email=Email, Name = Name, Surname = Surname, Password = Password, **other_fields)
class Customer(AbstractBaseUser, PermissionsMixin):
Email = models.EmailField(gettext_lazy('email address'), max_length=256, unique=True)
Name = models.CharField(max_length=64)
Surname = models.CharField(max_length=64, null=True)
Birthday = models.DateField(auto_now=False, null=False,blank=True)
PhoneNumber = models.CharField(max_length=16, unique=True, blank=True)
Address = models.CharField(max_length=128, blank=True)
RegistrationDate  = models.DateTimeField(default=timezone.now, editable=False)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
objects = UserAccountManager()
USERNAME_FIELD = 'Email'
REQUIRED_FIELDS = ['Name', 'Surname']
def __str__(self):
return self.Name + " " + self.Surname
def has_perm(self, perm, obj = None):
return self.is_superuser

这是我的管理员。py

from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.core.exceptions import ValidationError
from .models import *
# Register your models here.
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = Customer
fields = ('Email', 'Name', 'Surname')
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise ValidationError("Passwords don't match")
return password2
def save(self, commit=True):
# Save the provided password in hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user

class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
class Meta:
model = Customer
fields = ('Email', 'Name','Surname','Birthday','PhoneNumber','Address', 'is_staff', 'is_active', 'is_superuser')
def clean_password(self):
return self.initial["password"]
class UserAdmin(BaseUserAdmin):
form = UserChangeForm
add_form = UserCreationForm

list_display = ('Email', 'Name', 'Surname')
list_filter = ('is_superuser','Email', 'Name', 'Birthday')
fieldsets = (
(None, {'fields': ('Email', 'password')}),
('Personal info', {'fields': ('Birthday','Name','Surname')}),
('Permissions', {'fields': ('is_superuser',)}),
)
add_fieldsets = ()
search_fields = ('Email',)
ordering = ('Email',)
filter_horizontal = ()

admin.site.register(Customer,UserAdmin)

这是错误的回溯

File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsfields__init__.py", line 1774, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'john.smith@gmail.com'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangocore
management__init__.py", line 401, in execute_from_command_line
utility.execute()
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangocore
management__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangocore
managementbase.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangocont
ribauthmanagementcommandscreatesuperuser.py", line 79, in execute
return super().execute(*args, **options)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangocore
managementbase.py", line 371, in execute
output = self.handle(*args, **options)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangocont
ribauthmanagementcommandscreatesuperuser.py", line 189, in handle
self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedelivery-projectdeliveryappmodels.py", l
ine 26, in create_superuser
return self.create_user(Email=Email, Name = Name, Surname = Surname, Password = Password, **other_fie
lds)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedelivery-projectdeliveryappmodels.py", l
ine 17, in create_user
user.save(using=self._db)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangocont
ribauthbase_user.py", line 67, in save
super().save(*args, **kwargs)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsbase.py", line 753, in save
self.save_base(using=using, force_insert=force_insert,
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsbase.py", line 790, in save_base
updated = self._save_table(
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsbase.py", line 872, in _save_table
updated = self._do_update(base_qs, using, pk_val, values, update_fields,
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsbase.py", line 906, in _do_update
filtered = base_qs.filter(pk=pk_val)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsquery.py", line 942, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsquery.py", line 962, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, *args, **kwargs)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsquery.py", line 969, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelssqlquery.py", line 1358, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelssqlquery.py", line 1377, in _add_q
child_clause, needed_inner = self.build_filter(
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelssqlquery.py", line 1319, in build_filter
condition = self.build_lookup(lookups, col, value)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelssqlquery.py", line 1165, in build_lookup
lookup = lookup_class(lhs, rhs)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelslookups.py", line 24, in __init__
self.rhs = self.get_prep_lookup()
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelslookups.py", line 76, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "C:UsersasusDesktopDjango_projectsDelivery_Websitedeliveryvenvlibsite-packagesdjangodbm
odelsfields__init__.py", line 1776, in get_prep_value
raise e.__class__(
ValueError: Field 'id' expected a number but got 'john.smith@gmail.com'.

在您的create_user方法中,您编写self.model(email, Name, Surname, **other_fields),在这里您将emailNameSurname作为位置参数传递,这就是您收到错误的原因(基本上,电子邮件被作为id字段,您传递的参数实际上会转到其他一些字段左右(。相反,将这些作为关键字参数传递。所以你的create_user方法是:

def create_user(self, Email, Name, Surname, Password = None, **other_fields):
# Your other code
user = self.model(Email=email, Name=Name, Surname=Surname, **other_fields)
# Your other code

注意:根据惯例,python中的变量名应该在snake_case中。所以应该是CCD_ 8而不是CCD_ 9,等等。参见PEP8——Python样式指南代码

最新更新