在 Django 中正确使用自定义标签时遇到问题

Posted

技术标签:

【中文标题】在 Django 中正确使用自定义标签时遇到问题【英文标题】:Trouble using a custom tag correctly with Django 【发布时间】:2019-07-17 22:50:30 【问题描述】:

总结

我一直在尝试让自定义标签在 Django 中工作,但似乎无法正确注册。

索引文件看起来可以正确加载,它只是抱怨标签没有正确注册。

我现在所做的只是将我注册标签的 .py 文件放入 django 安装应用程序部分中的应用程序中。

我应该做其他事情来确保标签正确注册吗?


更多信息

我得到的错误:

第 1 行的块标记无效:“show_loans”。你忘记注册了吗 还是加载这个标签?

我调用标签的视图

index.html

% show_loans %

我尝试注册标签的python文件

loansTable.py

from .models import Loan
from datetime import datetime
from django import template

register = template.Library()

@register.simple_tag('loansTable.html')
def show_loans():
    l1 = Loan()
    l2 = Loan()
    l1.loanedDate_date = datetime.now
    l2.handinDate_date = datetime.now
    l2.loanedDate_date = datetime.now
    l2.handinDate_date = datetime.now
    loans2 =     l1, l2 
    return 'loans': loans2

loansTable.html

<ul>
    % for loan in loans %
        <li>  loan  </li>
    % endfor %
</ul>

文件夹结构:

-app
--templates
---customTemplates
----index.html
----loansTable.html
--loansTable.py

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您无需将标签注册到模板。你只需要从那里加载它。你已经在做。

因此只需替换:

@register.simple_tag('loansTable.html')

有了这个:

@register.simple_tag

您还需要将自定义标签放在templatetags 目录中。来自文档:

在您的 index.html 中,您必须按已注册模板标签的文件名加载模板标签。 即如果您在custom_tags.py 文件中注册了标签

% load custom_tags %

应用程序应该包含一个 templatetags 目录,与 models.py、views.py 等处于同一级别。如果不存在,请创建它 - 不要忘记 init .py 文件,以确保该目录被视为 Python 包。

【讨论】:

我刚刚测试过。我仍然遇到同样的错误。 @Doh09 更新了我的答案 您需要在 your_app/templatetags/custom_tags.py 中注册您的标签,然后加载到您的 html 文件中【参考方案2】:

错误告诉你到底是哪里出了问题:你没有在你使用它的模板中加载标签,即index.html。

% load loansTable %
% show_loans %

另外,您混淆了标签类型。呈现另一个模板的标记称为包含标记,因此您应该在注册时使用它:

@register.inclusion_tag('loansTable.html')
def show_loans():
    ...

【讨论】:

我认为他认为他需要指定注册哪个模板。因此名称为loansTable.html 那么他为什么要在 index.html 中调用它,而不是在 loanTable.html 中呢?该结构与包含标记完全匹配。 这是我第一次使用 Django。结束了注册:@register.inclusion_tag('loansTable.html') 以及将loansTable.py 放在模板标签中,将loansTable.html 放在模板中。然后我还在索引文件中使用了 load 关键字,之后就可以按预期使用标签了。我知道我做的不对,但我对文档感到困惑。感谢您指出我做错了什么。

以上是关于在 Django 中正确使用自定义标签时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何查看已定义的自定义标签?

在自定义模板标签中解析 Django 自定义模板标签

如何在 django 的自定义过滤器中使用 % url % 来显示主题标签

Django的自定义标签

如何从文件中加载自定义 Django 标签?

如何将自定义标签/过滤器添加到现有的 Django 应用程序?