【问题标题】:Django 3.1, I'm NOT getting RelatedObjectDoesNotExist error for User and Profile modelsDjango 3.1,我没有收到 User 和 Profile 模型的 RelatedObjectDoesNotExist 错误
【发布时间】:2020-12-06 16:33:53
【问题描述】:

如标题所示,我在 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)

'''

views.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。但我没有!这是为什么?另外,如果我手动编辑数据库并删除配置文件并保留用户,用户仍然可以正常工作,没有任何相关对象DoesNotExist 错误! 这是 Django 3.1 改变的东西吗?

谢谢

【问题讨论】:

    标签: django django-models django-views django-database django-3.1


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      尝试在同一文件夹中创建一个新的 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()  
      

      【讨论】:

        猜你喜欢
        • 2015-01-19
        • 2018-02-27
        • 2020-09-03
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 2023-01-04
        • 2014-11-27
        • 1970-01-01
        相关资源
        最近更新 更多