Jas*_*son 3 python django django-templates
我在我的网站上使用 Django 模板,并且我有一个用于网页标题的模板块:我有一个基本模板 (base.html),它<title>按如下方式制定元素:
<title>{% block title %}{%endblock %} - Website Title</title>
然后,在每个页面模板中,我放置了一个块,如下所示:
{% block title %}Webpage Name Here, e.g. About Us{% endblock %}
这会给我:<title>Webpage Name Here, e.g. About Us - Website Title</title>
有没有办法在基本模板内以编程方式确定块的大小/长度/内容title?我想让我的主页上的标题中没有“-”,而只是显示“网站标题”。我认为最好的方法是做类似的事情:
<title>{% block title %}{% end block %}{% if title|length > 0} - {/if}Website Title</title>
...但我无法弄清楚如何确定{% block title %}从页面模板传递的长度。
根据我对文档的理解,block标签不能分配给变量(至少我无法找到解决方法),并且该值不能在页面的其他地方重用。这可能是因为模板继承模型如何对待它:
\n\n存在此限制是因为块标记在 \xe2\x80\x9cboth\xe2\x80\x9d 方向上工作。也就是说,块标记不只是提供一个洞来填充 xe2x80x93,它还定义了填充父级中洞的内容。
\n
但是,可以使用该{% filter %}块实现您想要的结果,因为它会过滤块内的内容并且不需要专门的变量。有一种干净的方法和一种有点hacky的方法来处理这个问题。
按照编写自定义模板过滤器中的步骤,编写一个suffix仅在值不为空时连接字符串的过滤器。
# filename: suffix.py\nfrom django import template\nfrom django.template.defaultfilters import stringfilter\n\nregister = template.Library()\n\n@register.filter\n@stringfilter\ndef suffix(value, args):\n return value + str(args) if value else value\nRun Code Online (Sandbox Code Playgroud)\n@stringfilter强制value首先被强制转换为字符串,因此\'\'应该是唯一的虚假值。但由于这是在 python 文件中,因此如果需要,您可以使用更适合的条件。
现在可以按如下方式加载base.html(后面的参数load必须是以前的文件名):
{% load suffix %}\n<!DOCTYPE html>\n<html lang="en">\n <head>\n <title>{% filter suffix:\' -\' %}{% block title %}{% endblock title %}{% endfilter %} Website Title</title>\n </head>\n\n <body>\n {% block content %}{% endblock content %}\n </body>\n</html>\nRun Code Online (Sandbox Code Playgroud)\n现在,如果子 HTML 文件覆盖了类似 的块{% block title %}About Us{% endblock title %},您将得到\n About Us - Website Title。如果它不包含该块,您将得到Website Title.
注意:我还没有完全检查有关安全字符串和自动转义的详细信息,因为过滤器的两个参数都是由开发人员选择的。如果您打算将此过滤器用于更复杂的输入或用户输入,请查看文档中的其他详细信息。
\ndefault和add过滤器此方法使用内置过滤器和记录的行为,但它不是很可读/直观,所以我会避免使用它。只需将<title>标签替换为
<title>{% filter default:0|add:\' -\' %}{% block title %}{% endblock title %}{% endfilter %} Website Title</title>\nRun Code Online (Sandbox Code Playgroud)\n这依赖于以下行为add,重点是我的:
\n\n该过滤器将首先尝试将两个值强制为整数。如果失败,\xe2\x80\x99 无论如何都会尝试将这些值相加。这适用于某些数据类型(字符串、列表等),但不适用于其他数据类型。如果失败,结果将为空字符串。
\n
我遇到的问题是,使用 justadd总是会添加破折号(即使在空的情况下),而join将字符串视为列表,因此在每个字符之间插入破折号。但如果该default值不是字符串,则会失败,因为\' -\'无法强制转换为整数(它不会转换0为\'0\',因此 int + str 不起作用)。
结果与第一种方法相同,非空块不会触发default并导致About Us - Website Title,而空块则保持为空,导致Website Title。
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |