IntegrityError at /admin/auth/user/11/delete/ FOREIGN KEY constraint failed

问题描述 投票:0回答:2

当我从我的管理面板中删除用户时,它显示给我错误我不明白这个错误的原因是什么或者我在哪里犯了错误。我可以更新和创建新用户并删除那些没有个人资料的用户,但由于我在下面给出的以下原因,拥有个人资料的用户无法删除。

账户/模型.py

from django.urls import reverse
from django.db import models
from django.contrib import auth
from PIL import Image
from django.db.models.signals import post_save
from django.dispatch import receiver

# Create your models here.

class User(auth.models.User,auth.models.PermissionsMixin):
    
    def __str__(self):
        return "@{}".format(self.username)

class Profile(models.Model):

        user = models.OneToOneField(auth.models.User, on_delete=models.CASCADE)
        avatar = models.ImageField(default='1.jpg', upload_to='displays', height_field=None, width_field=None, max_length=None)
    
    
        def __str__(self):
            return f'{self.user.username} Profile'
    
    def save(self,*args, **kwargs):
        super(Profile,self).save(*args, **kwargs) #it will take data and save it

        dp = Image.open(self.avatar.path) #storing avatar in variable
        if dp.height >300 or dp.width >300:
            output_size =(300,300) #set any size you want
            dp.thumbnail(output_size) 
            dp.save(self.avatar.path) #after resizing it save it in data base in place of uploaded once by user
 

    def get_absolute_url(self):
        return reverse("Profile_detail", kwargs={"pk": self.pk})

@receiver(post_save, sender=User)
def create_profile(sender, created,instance,**kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_profile(sender, instance,**kwargs):
    instance.profile.save()

账户/表格.py

    from django import forms
    from django.contrib.auth.forms import UserCreationForm
    from django.core.exceptions import ValidationError
    from django.core import validators
    
    User = get_user_model()
    
    class UserCreateForm(UserCreationForm):
    
        class Meta:
            fields = ["username","email","password1","password2"]
            model = get_user_model()
            widgets ={
                'username' : forms.TextInput(attrs={'class':'textinputclass','placeholder':'username'}),
            }
        
        def clean_email(self):
            email = self.cleaned_data["email"]
            if User.objects.filter(email__iexact=email).exists():
                raise forms.ValidationError("Email is invalid")
            return email
        
    
        def __init__(self,*args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['username'].label = 'Display Name'
            # self.fields['email'].label = 'Email Address'

账户/views.py

user = User
class SignUp(CreateView):
    form_class = forms.UserCreateForm
    
    def form_valid(self, form):
        if form.is_valid:
            email = form.cleaned_data.get('email')
            user = form.save(commit=False)
            user.is_active = False
            send_mail(
            'i gotch you',
            'how are uou',
            '[email protected]',
            [email],
            fail_silently=False,
            )
        return super(SignUp, self).form_valid(form)
    success_url = reverse_lazy('login')
    template_name = "accounts/signup.html"
python-3.x django django-models django-forms django-views
2个回答
0
投票

这是由于 on_delete=CASCADE 。这意味着如果 ForeignKey 引用的对象被删除,那么它也应该删除引用对象。这样的级联因此会导致大量对象被删除,因为对象的删除实际上会触发其他删除,等等。

试试这个:

class Profile(models.Model):
    user = models.OneToOneField(auth.models.User, null=True on_delete=models.SET_NULL)

0
投票

您需要将 post_save、post_delete 更改为 pre_save 和 pre_delete,它会正常工作

© www.soinside.com 2019 - 2024. All rights reserved.