尽管使用if语句,但RelatedObjectDoesNotExist错误

时间:2018-09-01 19:33:39

标签: django python-3.x django-templates django-views

我有下面的代码if self.request.user.is_authenticated() and self.request.user. userlocation,我不明白为什么我得到这个用户没有用户定位错误。我有一个if语句,如果不满足他的条件,不应该只显示上下文

class Homepage(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super(Homepage, self).get_context_data(**kwargs)
        context['event_list'] = Event.objects.all()
        if self.request.user.is_authenticated() and self.request.user.userlocation:
            print("The code reached here ")
        return context

下面是models.py

class UserLocation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    lat = models.FloatField(blank=True, null=True)
    lon = models.FloatField(blank=True, null=True)
    point = models.PointField(srid=4326, default='SRID=4326;POINT(0.0 0.0)')
    objects = models.GeoManager()

enter image description here

3 个答案:

答案 0 :(得分:4)

对您的 if 子句使用额外条件,该子句通过使用来检查是否存在 userlocation 属性Python的hasattr()方法

尝试一下

class Homepage(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super(Homepage, self).get_context_data(**kwargs)
        context['event_list'] = Event.objects.all()
        if self.request.user.is_authenticated() and \
                hasattr(self.request.user, 'userlocation') and \
                self.request.user.userlocation:
            print("The code reached here ")
        return context



参考
Django check if a related object exists error: RelatedObjectDoesNotExist

答案 1 :(得分:2)

我猜您构建了一个类似于以下内容的模型:

class UserLocation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # ...

与普遍看法相反,一对一字段不是并不表示所引用的模型(此处为User)总是具有{{1 }}对象。 UserLocation实际上是具有OneToOneField约束的ForeignKey字段(以及一些额外的逻辑,使得反向关系不是unique=True,而是userlocation_set)。因此,这意味着两个userlocation不能永远引用相同 UserLocation对象。

因此,某些User可能没有user.userlocation,并且在调用该属性的情况下,不幸的是它返回 not user,但是引发错误(有一些请求返回None的票证,但由于向后兼容,它可能不会在(不久的将来)实现)。

因此,您应该使用None-try-catch进行检查:

except

答案 2 :(得分:0)

User 类没有 userlocation 变量。 使用从User

继承的自定义用户类