我想在个人资料页面上获取用户帖子。 我当前的代码是:
# views.py
def show_blog(request, username):
# If username exists
if User.objects.filter(username = username).exists():
# Get user data and rendert the page
user_data = {'user': User.objects.get(username = username)}
user_posts = {'posts': Post.objects.filter(author = user_data.id)}
return render(request, "blogs/show_blog.html", user_data)
return HttpResponse(404)
# show_blog.html - later, I'll make it show user posts
<h1>@{{ user }}</h1>
<p>{{ user.first_name }} {{ user.last_name }}</p>
现在,问题出在这个错误上:
AttributeError at /blogs/testuser/
'dict' object has no attribute 'id'
当我去:
/blogs/testuser
答案 0 :(得分:0)
您不能使用user_data.id
,因为user_data
是包含'user'
键而不是User
对象本身的字典。
您可以使用user
代替:
from django.shortcuts import get_object_or_404
def show_blog(request, username):
user = get_object_or_404(User, username=username)
context = {
'user': user,
'posts': Post.objects.filter(author=user)
}
return render(request, 'blogs/show_blog.html', context)
您通过迭代来呈现帖子:
{% for post in posts %}
{{ post }}
{% endfor %}
注意:通常最好使用
get_object_or_404(…)
[Django-doc], 然后直接使用.get(…)
[Django-doc]。如果对象不存在, 例如,由于用户自己更改了网址,因此get_object_or_404(…)
将导致返回 HTTP 404 Not Found 响应,而使用.get(…)
将导致 HTTP 500服务器错误。
答案 1 :(得分:0)
您正在尝试使用字典作为查询集。字典项只是键值对。
user = User.objects.get(username = username)
posts = Post.objects.filter(author = user.id)
context = {'user':user,'user_posts':posts}
return render(request, "blogs/show_blog.html", context)
现在您可以在模板中完成
<h1>{{user.username}}</h1>
<p>{{ user.first_name }} {{ user.last_name }}</p>
<p>{{ user_posts.title }}</p>