我在Django中有一个博客应用程序,在主页上我显示所有帖子以及发布的用户。但是,我现在尝试在用户名旁边添加用户的个人资料图像,但我似乎无法从 Profile 对象中提取任何数据。在我的模板中,当我循环浏览帖子时,诸如{{ post.user }}
之类的代码工作正常,但是当我尝试扩展post.user.profile.profile_image.url
时,什么都没有显示。
models.py:
class Post(models.Model):
user = models.ForeignKey(User, on_delete= models.CASCADE)
class Profile(models.Model):
user = models.ForeignKey(User, on_delete= models.CASCADE)
profile_image = models.ImageField(default='image.png', upload_to='profile_images', blank=True, null=True)
views.py:
def home(request):
posts = Post.objects.annotate(comments_count=Count('comments')).order_by('-created_date')
common_tags = Post.tags.most_common()[:4]
title = ""
return render(request, 'post/home.html', {'posts': posts, 'common_tags': common_tags})
在我的 html 模板中,我只是在做一个{% for post in posts %}
循环。
有什么想法吗?
谢谢!!
ForeignKey
是一种多对一关系,因为多个Profile
都可以指向同一个User
。这也意味着,如果您不指定related_name=…
参数 [Django-doc],您可以使用user.profile_set.all()
访问相关的配置文件。
你可能需要的是一个OneToOneField
[Django-doc]。这本质上是一个ForeignKey
,但带有unique=True
参数,但是名称约定也不同,如果你不指定related_name=…
,那么它只是.modelname
,所以这意味着你用user.profile
访问Profile
。
因此,您可以将其更改为:
from django.conf import settings
class Profile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete= models.CASCADE
)
profile_image = models.ImageField(
default='image.png',
upload_to='profile_images',
blank=True,
null=True
)
注意:通常最好使用settings.AUTH_USER_MODEL
[Django-doc] 来引用用户模型,而不是直接使用
User
模型 [Django-doc]。有关详细信息,请参阅文档的引用User
模型部分。