这是有问题的错误:
/ admin / accounts / user /中的IntegrityError 外键约束失败
我在其他地方看过,找不到任何简单的解决方法。我相信这个错误是因为我使用了一个自AbstractBaseUser继承的自定义用户模型,因为我希望我的网站没有用户名,而是主要通过电子邮件来标识用户。我是使用Django以及与关系数据库相关的任何内容的初学者。
#src/accounts.models.py
from django.conf import settings
from django.db import models
from django.db.models.signals import pre_save, post_save
from django.contrib.auth.models import (
AbstractBaseUser, BaseUserManager
)
from django.core.mail import send_mail
from django.template.loader import get_template
class UserManager(BaseUserManager):
def create_user(self, email, full_name=None, password=None, is_active=True, is_staff=False, is_admin=False):
if not email:
raise ValueError("Users must have an email address")
if not password:
raise ValueError("Users must have a password")
user_obj = self.model(
email = self.normalize_email(email),
full_name=full_name
)
user_obj.set_password(password) # change user password
user_obj.staff = is_staff
user_obj.admin = is_admin
user_obj.is_active = is_active
user_obj.save(using=self._db)
return user_obj
def create_staffuser(self, email,full_name=None, password=None):
user = self.create_user(
email,
full_name=full_name,
password=password,
is_staff=True
)
return user
def create_superuser(self, email, full_name=None, password=None):
user = self.create_user(
email,
full_name=full_name,
password=password,
is_staff=True,
is_admin=True
)
return user
class User(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
full_name = models.CharField(max_length=255, blank=True, null=True)
is_active = models.BooleanField(default=True) # can login
staff = models.BooleanField(default=False) # staff user non superuser
admin = models.BooleanField(default=False) # superuser
timestamp = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email' #username
# USERNAME_FIELD and password are required by default
REQUIRED_FIELDS = [] #['full_name'] #python manage.py createsuperuser
objects = UserManager()
def __str__(self):
return self.email
class EmailActivation(models.Model):
user = models.ForeignKey(User,
blank=True,
null=True,
on_delete=models.CASCADE
) # required on Django 2.0+ deletes child objects on_delete
#the error must be caused by this
email = models.EmailField()
key = models.CharField(max_length=120, blank=True, null=True)
activated = models.BooleanField(default=False)
forced_expired = models.BooleanField(default=False)
expires = models.IntegerField(default=7) # 7 Days
timestamp = models.DateTimeField(auto_now_add=True)
update = models.DateTimeField(auto_now=True)
def __str__(self):
return self.email
def regenerate(self):
self.key = None
self.save()
if self.key is not None:
return True
return False
def send_activation(self):
if not self.activated and not self.forced_expired:
if self.key:
base_url = getattr(settings, 'BASE_URL', '<my-domain>')
key_path = self.key # use reverse
path = "{base}{path}".format(base=base_url, path=key_path)
context = {
'path': path,
'email': self.email
}
txt_ = get_template("registration/emails/verify.txt").render(context)
html_ = get_template("registration/emails/verify.html").render(context)
subject = '1-Click Email Verification'
from_email = settings.DEFAULT_FROM_EMAIL
recipient_list = [self.email]
sent_mail = send_mail(
subject,
txt_,
from_email,
recipient_list,
html_message=html_,
fail_silently=False,
)
return sent_mail
return False
def pre_save_email_activation(sender, instance, *args, **kwargs):
if not instance.activated and not instance.forced_expired:
if not instance.key:
instance.key = unique_key_generator(instance)
pre_save.connect(pre_save_email_activation, sender=EmailActivation)
def post_save_user_create_reciever(sender, instance, created, *args, **kwargs):
if created:
obj = EmailActivation.objects.create(user=instance, email=instance.email)
obj.send_activation()
post_save.connect(post_save_user_create_reciever, sender=User)
class GuestEmail(models.Model):
email = models.EmailField()
active = models.BooleanField(default=True)
update = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.email