Полагаю, вы создали модель, похожую на:
class UserLocation(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
# ...
Вопреки распространенному мнению, поле «один-к-одному» означает , а не означает, что ссылочная модель (здесь User
) всегда имеет объект UserLocation
. OneToOneField
на самом деле представляет собой поле ForeignKey
с ограничением unique=True
(и некоторой дополнительной логикой, такой, что обратное отношение не userlocation_set
, а userlocation
). Таким образом, это означает, что две UserLocation
могут никогда не ссылаться на один и тот же User
объект.
Таким образом, возможно, что для некоторых user
не существует user.userlocation
, и в случае вызова атрибута, к сожалению, он возвращает не None
, но выдает ошибку (произошла ошибка). Билеты на запрос, что он возвращает None
, но, вероятно, он не будет реализован в (ближайшем) будущем из-за обратной совместимости).
Таким образом, вы должны проверить с try
- catch
- except
:
from django.core.exceptions import ObjectDoesNotExist
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()
try:
my_location = self.request.user.userlocation
except ObjectDoesNotExist:
# ... hande case where the location does <b>not</b> exists
else:
print("The location is {}".format(my_location))
return context