Django:从 db returns <Queryset [...]> 调用对象
Django: calling objects from db returns <Queryset [...]>
我正在尝试建立一个非常简单的博客应用程序,同时显示我数据库中的所有帖子。但是,我的四篇文章在页面上显示为
<QuerySet [<Post: Test content>, <Post: Second test post>, <Post: Third time's the charm>, <Post: Here is a post.>]>
我也无法像 flask 那样将任何第二个变量传递给 html 模板:testvar 根本不显示,即使它在 html 模板中。这些问题是否相关?如何在页面上获取多个变量,以及如何使帖子看起来像普通文本?
views.py:
1 from django.shortcuts import render
2 from django.http import HttpResponse
3
4 from .models import Post
5
6 def post(request ):
7 testvar = "TEST VARIABLE PLZ IGNORE"
8 post_list = Post.objects.order_by('id')
9
10 return render(request, 'posts/main.html',
11 {'post': post_list}, {'testvar': testvar},
12 )
models.py:
1 from django.db import models
2
3 class Post(models.Model):
4 content = models.CharField(max_length = 200)
5
6 def __str__(self):
7 return self.content
main.html:
1 <head>
2 <h1>{{ post }}</h1>
3
4 </head>
5
6 <body>
7 {{ testvar }}
8 {% for i in post_list %}
9 <li>i</li>
10 {% endfor %}
11 </body>
我是 django 的新手,所以如果有任何其他建议或批评,我将不胜感激。谢谢。
首先,您需要将 单个 字典传递给 render
:
return render(request, 'posts/main.html',
{'post': post_list, 'testvar': testvar},
)
您的模板不会为您提供您要求的输出,因为您从不显示整个 post_list
或循环中每个元素的内容。想必你的意思是:
{% for i in post_list %}
<li>{{ i }}</li>
{% endfor %}
Edit 正如 Sayse 在评论中指出的那样,变量名称之间存在不匹配。您将帖子列表作为 post
传递,因此当您在模板中执行 {{ post }}
时,您将打印整个列表。根本没有名为 post_list
的变量,因此模板底部的循环甚至都不会执行。
您应该使用一致的名称; post_list
似乎更合适。
return render(request, 'posts/main.html',
{'post_list': post_list, 'testvar': testvar},
)
在您的 views.py
中将 return 语句更改为:
return render(request, 'posts/main.html', {'post': post_list, 'testvar': testvar})
因为 render 的第三个参数需要一个字典。此外,为了在您的模板中呈现帖子,您应该将帖子打印为
{% for i in post_list %}
<li>{{ i }}</li>
{% endfor %}
context
应该是一个字典,包含您需要的 key:value 对
6 def post(request ):
7 testvar = "TEST VARIABLE PLZ IGNORE"
8 post_list = Post.objects.order_by('id')
9
10 return render(request, 'posts/main.html',
11 {'post': post_list, 'testvar': testvar},
12
我正在尝试建立一个非常简单的博客应用程序,同时显示我数据库中的所有帖子。但是,我的四篇文章在页面上显示为
<QuerySet [<Post: Test content>, <Post: Second test post>, <Post: Third time's the charm>, <Post: Here is a post.>]>
我也无法像 flask 那样将任何第二个变量传递给 html 模板:testvar 根本不显示,即使它在 html 模板中。这些问题是否相关?如何在页面上获取多个变量,以及如何使帖子看起来像普通文本?
views.py:
1 from django.shortcuts import render
2 from django.http import HttpResponse
3
4 from .models import Post
5
6 def post(request ):
7 testvar = "TEST VARIABLE PLZ IGNORE"
8 post_list = Post.objects.order_by('id')
9
10 return render(request, 'posts/main.html',
11 {'post': post_list}, {'testvar': testvar},
12 )
models.py:
1 from django.db import models
2
3 class Post(models.Model):
4 content = models.CharField(max_length = 200)
5
6 def __str__(self):
7 return self.content
main.html:
1 <head>
2 <h1>{{ post }}</h1>
3
4 </head>
5
6 <body>
7 {{ testvar }}
8 {% for i in post_list %}
9 <li>i</li>
10 {% endfor %}
11 </body>
我是 django 的新手,所以如果有任何其他建议或批评,我将不胜感激。谢谢。
首先,您需要将 单个 字典传递给 render
:
return render(request, 'posts/main.html',
{'post': post_list, 'testvar': testvar},
)
您的模板不会为您提供您要求的输出,因为您从不显示整个 post_list
或循环中每个元素的内容。想必你的意思是:
{% for i in post_list %}
<li>{{ i }}</li>
{% endfor %}
Edit 正如 Sayse 在评论中指出的那样,变量名称之间存在不匹配。您将帖子列表作为 post
传递,因此当您在模板中执行 {{ post }}
时,您将打印整个列表。根本没有名为 post_list
的变量,因此模板底部的循环甚至都不会执行。
您应该使用一致的名称; post_list
似乎更合适。
return render(request, 'posts/main.html',
{'post_list': post_list, 'testvar': testvar},
)
在您的 views.py
中将 return 语句更改为:
return render(request, 'posts/main.html', {'post': post_list, 'testvar': testvar})
因为 render 的第三个参数需要一个字典。此外,为了在您的模板中呈现帖子,您应该将帖子打印为
{% for i in post_list %}
<li>{{ i }}</li>
{% endfor %}
context
应该是一个字典,包含您需要的 key:value 对
6 def post(request ):
7 testvar = "TEST VARIABLE PLZ IGNORE"
8 post_list = Post.objects.order_by('id')
9
10 return render(request, 'posts/main.html',
11 {'post': post_list, 'testvar': testvar},
12