在Django模板中显示查询集对象

时间:2019-02-17 17:29:17

标签: django

我有一个模型Post,我试图将所有帖子显示到模板上。我将post.html包含在home.html中。 我发现了与我的问题类似的问题,但是对象仍然没有显示link

我尝试使用python manage.py shell创建对象。所以首先我做到了。 Post.objects.all() <QuerySet [<Post: test>, <Post: admin>]>

然后我尝试创建一个新帖子。 Post.objects.create(user="test", content="New comment") 但是出现了这个错误: ValueError: Cannot assign "'test'": "Post.user" must be a "User" instance.

试图进行故障排除,但无法解决。因此,我决定将代码编写在posts / views.py中,但效果也不佳。我认为这是问题的根源,为什么这些对象未显示在模板中。

这是我的posts / posts.views


def posts_list(request):
    # if request.user.is_authenticated():
    queryset = Post.objects.all()
    context = {
        "object_list": queryset,
        "user": "username"
    }
    return render(request, "posts.html", context)

这是我的模板/post.html

<!DOCTYPE html>
<html lang="en">
  <body>
    <h1>What's on your mind, {{ user }}</h1>
    { % for obj in object_list %}
    {{obj.user}}<br/>
    {{obj.content}}<br/>
    {{obj.timestamp}}<br/>
    {% endfor %}

  </body>
</html>

3 个答案:

答案 0 :(得分:0)

通常在请求中,django自动添加请求的用户。如果该用户具有添加新帖子的相关权限,则以下代码应该可以工作

Post.objects.create(user=request.user, content="New comment")

答案 1 :(得分:0)

您在这里问了两个问题。我将在下面回答两个问题:

显示您的帖子

首先,您需要确保将用户对象传递给模板。假设用户信息存储在request.user中,您可以按照以下步骤进行操作:

views.py:

def posts_list(request):

    if request.user.is_authenticated:

        user = request.user
        queryset = Post.objects.all()

        context = {
            "object_list": queryset,
            "user": user
        }

        return render(request, "home.html", context)

home.html:

<html>
<h1>Homepage</h1>
{% if user.is_authenticated %}
<h1>What's on your mind, {{ user }}</h1>
    { % for obj in object_list %}
    {{obj.user}}<br/>
    {{obj.content}}<br/>
    {{obj.timestamp}}<br/>
    {% endfor %}
<a href="{% url 'logout' %}">Logout</a>
{% endif %}
</html>

为用户添加帖子

您需要获取一个用户对象以传递给您的创建方法,而不是使用字符串“ test”。尝试失败的原因是因为您正在向该函数传递期望用户对象的字符串(“测试”)。

此行吸引了一个用户(任意获取列表中的第一个用户):

u = User.objects.all()[0]

此行导入datetime模块,您需要使用该模块为您的create方法生成日期和datetime对象:

import datetime

此行为该用户创建了一条帖子:

Post.objects.create(user=u, content="New comment", publish=datetime.date.today(), updated=datetime.datetime.now(), timestamp=datetime.datetime.now())

答案 2 :(得分:0)

创建外键时,是在引用模型。 假设有两个模型A和B。B具有以下字段-x,y,z。现在,x字段是一个外键,它引用模型A。

现在,无论何时要创建B的对象,那么x字段的值都应该是A的对象。有点像这样-

post1 = Post(用户=用户模型的对象,内容=“您的值”)

因此首先创建一个User对象。然后在那写。否则会报错。