尝试/除了仍然抛出RelatedObjectsDoesNotExister错误?德扬戈

2024-09-27 09:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

这个try/except块有什么问题? 我尝试根据帐户类型返回不同的页面(我有一个自定义用户模型)

def home(request):
  if request.user.is_authenticated:
    try:
        if CustomUser.objects.get(pk=request.user.id).vendoruser:
            return redirect('test')
    except CustomUser.objects.get(pk=request.user.id).vendoruser.DoesNotExist:
        return redirect('test2')

   return render(request, 'main/home.html')

返回

RelatedObjectDoesNotExist at /

CustomUser has no vendoruser.

型号:

    class CustomUser(AbstractUser):

        def __str__(self):
            return self.email

    class ClientUser(models.Model):
        user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
        client_name = models.CharField(max_length=50)

        def __str__(self):
            return self.client_name

    class VendorUser(models.Model):
        contact_person = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
        company_name = models.CharField(max_length=50, null=False, blank=False)
        company_address_line_1 = models.CharField(max_length=50, null=False, blank=False)
        company_address_line_2 = models.CharField(max_length=50, null=False, blank=False)
        postcode = models.CharField(max_length=8, null=False, blank=False)

        def __str__(self):
            return self.company_name

Tags: nameselffalsereturnmodelsrequestdefnull
2条回答

vendoruser不存在时,您不能使用它的任何属性(vendoruser.DoesNotExist)。而是这样做

from django.core.exceptions import ObjectDoesNotExist


try:
    if CustomUser.objects.get(pk=request.user.id).vendoruser:
        return redirect('test')
except ObjectDoesNotExist:
    return redirect('test2')

或者使用此字段与(YourRelatedModel.DoesNotExist)相关的模型中的DoesNotExist

请注意,您不需要执行CustomUser.objects.get(pk=request.user.id),只需使用request.user

您可以使用hasattr测试是否设置了request.user.vendoruser`

因此,您的视图可以简化为:

def home(request):
    if request.user.is_authenticated:
        if hasattr(request.user, 'vendoruser'):
            return redirect('test')
        else:
            return redirect('test2')

    return render(request, 'main/home.html')

相关问题 更多 >

    热门问题