-1

如标题所示,我在 Django 3.1(最新版本)中没有收到 RelatedObjectDoesNotExist 错误,我没有使用信号。我使用 (python manage.py createsuperuser) 命令创建了一个超级用户,正如预期的那样,它不会创建配置文件。

模型.py'''

class User(AbstractUser):
    pass


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    birth_date = models.DateField(null=True, blank=True)

'''

视图.py

'''

class RegisterView(View):

    def get(self, request):
        form = UserSignUpForm()
        # print(form)
        return render(request, 'users/register.html', {'form': form})

    def post(self, request):
        form = UserSignUpForm(request.POST)

        if form.is_valid():
            form.save()

            username = request.POST.get('username')
            Profile.objects.create(user=User.objects.get(username=username))

            return redirect('users:login-page')
        return render(request, 'users/register.html', {'form': form})

'''

当我使用 createsuperuser 命令时,没有创建配置文件,所以如果我尝试登录,我希望得到 RelatedObjectDoesNotExist。但我没有!这是为什么?另外,如果我手动编辑数据库并删除配置文件并保留用户,则用户仍然可以正常工作,并且没有任何 RelatedObjectDoesNotExist 错误!这是 Django 3.1 改变的东西吗?

谢谢你

4

2 回答 2

0

尝试在同一文件夹中创建一个新的 signals.py 并在下面创建 create_profile 和 save_profile 函数,这应该可以工作。

from django.db.models.signals import post_save  
from django.contrib.auth.models import User  
from django.dispatch import receiver  
from .models import Profile  

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

@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()  
于 2020-12-28T19:18:12.250 回答
0

我确实发现了这个问题。在没有连接 User 和 Profile 模型的信号的情况下,Django 无法判断登录用户的配置文件丢失,并且没有引发错误。

于 2020-08-17T15:04:48.913 回答