Соответствующий запрос не существует (Django)
Я создал сайт форума. При нажатии на профиль пользователя получаю в консоли ошибку library.models.SiteUser.DoesNotExist: SiteUser, соответствующий запросу, не существует.
В браузере также отображается: DoesNotExist at /profile/1/
СайтПользователь, соответствующий запросу, не существует.
Браузер выделяет эту строку userprof = SiteUser.objects.get(id=pk)
Это мой views.py:
def userProfile(request, pk):
user = User.objects.get(id=pk)
**userprof = SiteUser.objects.get(id=pk)**
posts = user.post_set.all()
post_comments = user.comment_set.all()
interests = Interest.objects.all()
context = {
'user': user,
'userprof': userprof,
'posts': posts,
'post_comments': post_comments,
'interests': interests
}
return render(request, 'library/profile.html', context)
models.py:
class SiteUser(models.Model):
page_user = models.OneToOneField(User, on_delete=models.CASCADE)
about = HTMLField()
profile_pic = models.ImageField('profile_pic', upload_to='covers', null=True)
Любая помощь будет очень признательна.
User и SiteUser не будут одинаковыми. Вы можете легко получить SiteUser из следующего запроса:
userprof = user.siteuser # efficient solution
Or
userprof = SiteUser.objects.get(user_id=pk) # alternative solution but should not be used in this code sample
По причине их отношения OneToOne. Для получения дополнительной информации, пожалуйста, ознакомьтесь с документацией.
Если у вас есть отношения, то всегда используйте их, если это возможно. Вместо того чтобы получать SiteUser
, имея User
pk
(не обязательно всегда одно и то же), получайте его, используя отношение между ними:
# bad and risky
user = User.objects.get(id=pk)
userprof = SiteUser.objects.get(id=pk)
# good and always working if object exists
user = User.objects.get(id=pk)
userprof = user.siteuser
Хорошая практика - называть related_name
аргумент для такого использования:
class SiteUser(models.Model):
page_user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='foobar')
Тогда вы можете назвать его так:
user = User.objects.get(id=pk)
userprof = user.foobar