我要在侧边栏(模板“ base_generic.html”)中显示db中所有注释的列表。我使用ListView做到了这一点,但这没用。
views.py
class CommentListView(generic.ListView):
template_name = "base_generic.html"
model = Comment
paginate_by = 5
base_generic.html
{% block sidebar %}
<h1>Comments list</h1>
{% if comment_list %}
<ul>
{% for comment in comment_list %}
<p>{{ comment.author }} ({{ comment.comment_date }}) {{ comment.description|safe }}</p>
{% endfor %}
</ul>
{% else %}
<p>There are no comments.</p>
{% endif %}
{% endblock %}
models.py
class Comment(models.Model):
description = models.TextField()
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
comment_date = models.DateTimeField(auto_now_add=True, null=True)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
class Meta:
ordering = ["-comment_date"]
def __str__(self):
return "{}".format(self.description)
DB有评论,但是在显示的页面上“没有评论”。 如何从ech url的基本模板中调用它?
答案 0 :(得分:2)
您不能以这种方式这样做。一个URL映射到一个视图,一个URL不能有多个视图。
如果需要在每个页面的基本模板中填充侧边栏,则需要使用自定义模板标记:inclusion tag可能就是您想要的。
答案 1 :(得分:0)
使用comments_list
代替comment_list
这是它的工作方式
'%s_list' % object_list.model._meta.model_name
您还可以设置context_object_name
并在模板中使用该名称
class CommentListView(generic.ListView):
context_object_name = 'custom name. comments for example'
...
答案 2 :(得分:0)
答案 3 :(得分:0)
感谢@DanielRoseman帮助。
在包含应用的文件夹中,创建文件夹“ templatetags ”,其中空文件“ __ init.py __ ”和下一个文件:
all_comments.py
from django import template
from post.models import Comment
register = template.Library()
@register.inclusion_tag('post/comment_list.html') #register function in template
def comment_list():
comments = Comment.objects.filter()[0:5] #take 5 last comments
return {'comments': comments}
然后创建模板“ comment_list.html ”:
{% for comment in comments %}
<p>{{ comment.author }} ({{ comment.comment_date }}) {{ comment.description|safe }}</p>
{% endfor %}
然后将我们的代码加载到“ base_generic.html ”
...
{% load all_comments %}
...
<div class="sidebar">
{% comment_list %}
</div>