我有下面的代码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()
答案 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