为什么不在基本模板中使用ListView?如何从基本模板调用ech url的视图?的Django 2.1.5

时间:2019-01-15 08:43:21

标签: python django

我要在侧边栏(模板“ 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的基本模板中调用它?

4 个答案:

答案 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)

使用泛型视图时,应使用$("#btn3").click(...)名称在模板中获取数据,也可以通过object_list进行更改。

context_object_name

Reference

答案 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>

More info