您好,我需要您的帮助:)
我在学校的这个Django项目中。 我用AbstractBaseUser类替换了auth_user表,并创建了一个名为UserLogin one的新类。 因此,创建超级用户可以正常使用,但使用注册页面创建用户则无法正常工作
我现在花了大约10个小时来解决这个错误,试图解决。 希望你能帮助我 谢谢你
如果您需要更多信息,请写下来
这是整个错误消息
TypeError: Field 'id' expected a number but got ((), {'email': 'admin@adminator.ch', 'first_name': 'ksfd', 'last_name': 'dfsg', 'location': 'Bern', 'date_of_birth': datetime.datetime(2020, 9, 29, 0, 0, tzinfo=<UTC>), 'plz': 4589, 'license_plate_number': 80291, 'license_plate_char': 'BE', 'country': 'CH', 'address': 'adminstrasse', 'phone_number': '0453268', 'raw_password': 'Balmistar45!', 'is_staff': False, 'is_superuser': False}).
[08/Oct/2020 09:03:08] "POST /accounts/signup HTTP/1.1" 500 176373
这是我的模型:
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.db import models
from django.contrib.auth.models import PermissionsMixin
from django.utils.translation import gettext_lazy as _
from django.utils import timezone
class UserAccountManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
"""
Create and save a user with the given email, and password.
"""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
def get_by_natural_key(self, email):
return self.get(**{self.model.USERNAME_FIELD: email})
country_choices = [
("CH", "CH"),
("DE", "DE"),
("FR", "FR"),
("BE", "BE"),
]
class UserLogin(AbstractBaseUser, PermissionsMixin):
"""
replaces auth_user table
examples for the fields:
location : Bern, Biel
license_plate_char : BE, NE, SG
"""
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
phone_number = models.CharField(max_length=15, null=False)
plz = models.IntegerField(null=True)
location = models.CharField(max_length=30)
address = models.CharField(max_length=30)
country = models.CharField(max_length=2, choices=country_choices)
license_plate_char = models.CharField(max_length=6)
license_plate_number = models.IntegerField(null=True)
email = models.EmailField(_('email address'), unique=True)
date_of_birth = models.DateTimeField(null=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
last_login = models.DateTimeField(null=True)
is_superuser = models.BooleanField(default=False)
objects = UserAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
views.py
from django.contrib.auth import login
from django.shortcuts import render, redirect
from parking_mgmt.forms import UserForm
from django.contrib import auth
from parking_mgmt.models import UserLogin
def home(request):
return render(request, 'home.html')
"""Login"""
def login_view(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect('home')
return render(request, 'registration/login.html')
def sign_up(request):
form = UserForm(request.POST or None)
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
user = UserLogin.objects.create_user(
first_name=form.cleaned_data['first_name'],
last_name=form.cleaned_data['last_name'],
location=form.cleaned_data['location'],
date_of_birth=form.cleaned_data['date_of_birth'],
plz=form.cleaned_data['plz'],
license_plate_number=form.cleaned_data['license_plate_number'],
license_plate_char=form.cleaned_data['license_plate_char'],
country=form.cleaned_data['country'],
address=form.cleaned_data['address'],
phone_number=form.cleaned_data['phone_number'],
email=form.cleaned_data['email'],
raw_password=form.cleaned_data['password1'],
)
user.save()
login(request, user)
return redirect('home')
else:
form = UserForm()
return render(request, 'registration/signup.html', {'form': form})
def logout(request):
auth.logout(request)
return render(request, 'registration/logout.html')
Forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import UserLogin, ParkingLot, Reservation, Price
class UserForm(UserCreationForm):
class Meta:
model = UserLogin
fields = ("email", "first_name", "last_name", "location", "password1", "date_of_birth",
"plz", "license_plate_number", "license_plate_char", "country", "address", "phone_number")
这是回溯。
System check identified no issues (0 silenced).
October 08, 2020 - 09:02:23
Django version 3.1.2, using settings 'djangoProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[08/Oct/2020 09:02:25] "GET /accounts/signup HTTP/1.1" 200 8372
[08/Oct/2020 09:02:25] "GET /static/css/bootstrap.min.css HTTP/1.1" 200 160308
[08/Oct/2020 09:02:25] "GET /static/js/bootstrap.min.js HTTP/1.1" 200 60050
Not Found: /favicon.ico
[08/Oct/2020 09:02:25] "GET /favicon.ico HTTP/1.1" 404 1827
Internal Server Error: /accounts/signup
Traceback (most recent call last):
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\fields\__init__.py", line 1774, in get_prep_value
return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\djangoProject\views.py", line 32, in sign_up
user = UserLogin.objects.create_user(
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\parking_mgmt\models.py", line 26, in create_user
return self._create_user(email, password, **extra_fields)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\parking_mgmt\models.py", line 20, in _create_user
user.save(using=self._db)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\contrib\auth\base_user.py", line 71, in save
super().save(*args, **kwargs)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\base.py", line 753, in save
self.save_base(using=using, force_insert=force_insert,
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\base.py", line 790, in save_base
updated = self._save_table(
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\base.py", line 872, in _save_table
updated = self._do_update(base_qs, using, pk_val, values, update_fields,
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\base.py", line 906, in _do_update
filtered = base_qs.filter(pk=pk_val)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\query.py", line 942, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\query.py", line 962, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, *args, **kwargs)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\query.py", line 969, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\sql\query.py", line 1358, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\sql\query.py", line 1377, in _add_q
child_clause, needed_inner = self.build_filter(
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\sql\query.py", line 1319, in build_filter
condition = self.build_lookup(lookups, col, value)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\sql\query.py", line 1165, in build_lookup
lookup = lookup_class(lhs, rhs)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\lookups.py", line 24, in __init__
self.rhs = self.get_prep_lookup()
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\lookups.py", line 76, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "G:\BIS19\ÜK307 - HTML, CSS - Interaktive Webseite erstellen\Django Projekt\mod-307-bis19p\venv\lib\site-packages\django\db\models\fields\__init__.py", line 1776, in get_prep_value
raise e.__class__(
TypeError: Field 'id' expected a number but got ((), {'email': 'admin@adminator.ch', 'first_name': 'ksfd', 'last_name': 'dfsg', 'location': 'Bern', 'date_of_birth': datetime.datetime(2020, 9, 29, 0, 0, tzinfo=<UTC>), 'plz': 4589, 'license_plate_number': 80291, 'license_plate_char': 'BE', 'country': 'CH', 'address': 'adminstrasse', 'phone_number': '0453268', 'raw_password': 'Balmistar45!', 'is_staff': False, 'is_superuser': False}).
[08/Oct/2020 09:03:08] "POST /accounts/signup HTTP/1.1" 500 176373
Process finished with exit code 0
答案 0 :(得分:1)
所以我只想写解决问题的方法。 或者只是帮助我的东西。
就像@Charles 说的,这只是一个迁移错误, 我的项目也有问题。 当我的朋友克隆 repo 并试用它时,代码运行良好。
所以我刚刚删除了我电脑上的项目。 制作了一个新项目并将其从我的 GitHub 存储库中合并,并且成功了。
所以我希望我能帮助别人。