TypeError:字段'id'需要一个数字但是得到了(()

时间:2020-10-08 08:53:36

标签: python html css django django-models

您好,我需要您的帮助:)

我在学校的这个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

1 个答案:

答案 0 :(得分:1)

所以我只想写解决问题的方法。 或者只是帮助我的东西。

就像@Charles 说的,这只是一个迁移错误, 我的项目也有问题。 当我的朋友克隆 repo 并试用它时,代码运行良好。

所以我刚刚删除了我电脑上的项目。 制作了一个新项目并将其从我的 GitHub 存储库中合并,并且成功了。

所以我希望我能帮助别人。