【问题标题】:Display query set object in django template在 django 模板中显示查询集对象
【发布时间】:2023-03-07 00:14:01
【问题描述】:

我有一个模型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.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>

【问题讨论】:

  • 用户实例表示settings.AUTH_USER_MODEL模型实例,“test”只是一个字符串,这不是用户实例。
  • 那么如何为已经在数据库中的用户添加帖子?还是有点迷茫。

标签: django


【解决方案1】:

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

显示您的帖子

首先,您需要确保将用户对象传递给您的模板。假设用户信息存储在 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”。您的尝试失败的原因是您正在向函数传递一个字符串(“test”),它需要一个用户对象。

这一行获取一个用户(任意抓取列表中的第一个用户):

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

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

import datetime

这一行为该用户创建了一个帖子:

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

【讨论】:

  • 是的,我意识到我在问两个问题,谢谢。你认为我的第一个问题是删除 template/posts.html 并且不包含在 templates/home.html 中?
  • 这是其中的一部分——在包含中传递参数并非易事,所以我现在通过将所有内容组合到一个模板中来简化事情。另一个大问题是您将“用户名”作为字符串而不是实际的用户对象传递给 views.py 中的模板。
  • 有什么特别的原因吗?
  • 好的,我理解你,但很明显我仍然做错了什么。我首先这样做u = Post.objects.all()[0]u = &lt;Post: test&gt;。然后Post.objects.create(user=u, content="New comment") 但我收到错误ValueError: Cannot assign "&lt;Post: test&gt;": "Post.user" must be a "User" instance.
  • 如果我使用u = User.objects.all()[0],我会得到NameError: name 'User' is not defined
【解决方案2】:

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

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

【讨论】:

  • 有趣。我仍然不明白它如何区分谁在发帖。它如何知道它的测试或管理员?还有为什么它不显示在模板/posts.html
  • 那行不通。我得到NameError: name 'request' is not defined
  • 你添加了你的基本中间件link你需要确保你正确添加了`django.contrib.auth.middleware.AuthenticationMiddleware中间件。
【解决方案3】:

当您创建外键时,您指的是一个模型。 假设有两个模型 A 和 B。B 具有以下字段 - x、y、z。现在,x 字段是一个外键,指的是模型 A。

现在每当你想创建一个B的对象,那么x字段的值就应该是A的一个对象。有点像这样-

post1 = Post(user = User Model 的一个对象, content = "你的价值")

所以首先创建一个用户对象。然后写在那里。否则会报错。

【讨论】:

  • 在我做的外壳里没问题。 from posts.models import Postfrom users.models import User。然后u = User.objects.all()[0]post0 = Post(user=u,content="test data")Post.objects.create(post0) 但得到一个错误create() takes 1 positional argument but 2 were given。我也认为当我解决这个问题时,我会收到这个错误django.db.utils.IntegrityError: NOT NULL constraint failed: posts_post.publish
猜你喜欢
  • 2012-12-28
  • 2021-11-17
  • 2020-10-17
  • 2012-05-28
  • 2013-04-27
  • 2021-10-03
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多