wagtail HTML 模板文件中的语法

syntax in wagtail HTML template file

在下面的 HTML Wagtail 模板中,

<h1>{{ page.title }}</h1>
    <div>{{ page.intro }}</div>

    {% for post in page.get_children %}
        <h2><a href="{% pageurl post %}">{{ post.title }}</a></h2>
        <p>{{ post.first_published_at }}</p>
        <p>{{ post.owner }}</p>

        {% if post.specific.rncategory.all.count %}
            {% for ctgy in post.specific.rncategory.all %}
                <a href="{% routablepageurl page "post_by_category" ctgy.slug %}">{{ctgy.category.name}}</a>
            {% endfor %}
        {% endif %}

        {% for tg in post.specific.rntags.all %}
            <button type="button">{{tg.tag.name}}</button>
        {% endfor %}
    {% endfor %}

Q1: 为什么我们使用page.get_children & post.specific.rncategory.all.count 而不是page.get_children()post.specific.rncategory.all().count() 预计会被更正?

而在PDB调试交互会话中则相反(page.get_children无效)

(Pdb++) obj.get_children()[0]
<Page: Detail>
(Pdb++) obj.get_children()[0].specific.rncategory.all.count
*** AttributeError: 'function' object has no attribute 'count'
(Pdb++) obj.get_children()[0].specific.rncategory.all
<bound method BaseManager.all of <modelcluster.fields.create_deferring_foreign_related_manager.<locals>.DeferringRelatedManager object at 0x7f7076003790>>
(Pdb++) obj.get_children()[0].specific.rncategory.all()
<QuerySet []>
(Pdb++) obj.get_children()[1].specific.rncategory.all()
<QuerySet [<Link_PostDetail_Category: Link_PostDetail_Category object (2)>]>
(Pdb++) obj.get_children()[1].specific.rncategory.all().count()
1
(Pdb++) obj.get_children()[0].specific.rncategory.all().count()
0
(Pdb++) 

这是 Django 模板语言的正常行为 - 按照设计,Django 模板代码不等同于 Python。

Django 模板语法 never uses () for function calls. Instead, whenever a variable lookup results in a callable, it will automatically be called with no arguments. See "Behind the scenes" under https://docs.djangoproject.com/en/stable/ref/templates/language/#variables.