python - 如何确定 Django 中的模板 block 是否为空/空白?

标签 python django django-templates

我正在为我的网站使用 Django 模板,并且我有一个用于网页标题的模板 block :我有一个基本模板 (base.html),它制定了 <title>像这样的元素:

<title>{% block title %}{%endblock %} - Website Title</title>

然后,在每个页面模板中,我放置了一个 block ,如下所示:

{% 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标签不能分配给变量(至少我无法找到解决方法),并且该值不能在页面的其他地方重用。这可能是因为模板继承模型如何对待它:

This limitation exists because a block tag works in “both” directions. That is, a block tag doesn’t just provide a hole to fill – it also defines the content that fills the hole in the parent.

但是,使用 {% filter %} 可以达到您想要的结果 block ,因为它过滤 block 内的内容并且并不特别需要变量。有一种干净的方法和一种有点hacky的方法来处理这个问题。


简洁的方式:定义自定义过滤器

按照 Writing custom template filters 中的步骤操作,写一个suffix仅当值不为空时连接字符串的过滤器。

# filename: suffix.py
from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def suffix(value, args):
    return value + str(args) if value else value

@stringfilter力量value首先将 a 强制转换为字符串,因此 ''应该是唯一的虚假值。但由于这是在 python 文件中,因此您可以根据需要使用更适合的条件。

现在可以将其加载到 base.html如下(load后面的参数必须是以前的文件名):

{% load suffix %}
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>{% filter suffix:' -' %}{% block title %}{% endblock title %}{% endfilter %} Website Title</title>
    </head>

    <body>
        {% block content %}{% endblock content %}
    </body>
</html>

现在,如果子 HTML 文件覆盖了像 {% block title %}About Us{% endblock title %} 这样的 block , 你会得到 About Us - Website Title 。如果它不包含该 block ,您将得到 Website Title .

注意:我还没有完全检查有关安全字符串和自动转义的详细信息,因为过滤器的两个参数都是由开发人员选择的。请查看 the docs 中的其他详细信息如果您打算将此过滤器用于更复杂的输入或用户输入。


黑客但简单的方法:使用 defaultadd过滤器

此方法使用内置过滤器和记录的行为,但它不是很可读/直观,所以我会避免使用它。只需替换 <title>标记为

<title>{% filter default:0|add:' -' %}{% block title %}{% endblock title %}{% endfilter %} Website Title</title>

这依赖于 add 的以下行为,强调我的:

This filter will first try to coerce both values to integers. If this fails, it’ll attempt to add the values together anyway. This will work on some data types (strings, list, etc.) and fail on others. If it fails, the result will be an empty string.

我遇到的问题是仅使用 add总是会加上破折号(即使在空的情况下),而 join将字符串视为列表,因此在每个字符之间插入破折号。但如果default value 不是字符串,它从 ' -' 开始失败无法强制转换为整数(它不会将 0 转换为 '0' ,因此 int + str 不起作用)。

结果与第一种方法相同,非空 block 不会触发default结果是 About Us - Website Title ,而空 block 保持为空,结果为 Website Title .

关于python - 如何确定 Django 中的模板 block 是否为空/空白?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71696844/

相关文章:

python - 当有多个时如何在字符串中查找某些字母?

django - 如何为 django-graphql-auth 使用自定义用户模型

Django 休息框架 : redirect if unauthenticated for browsable API

Django 表单字段分组

ManyToMany 的 Django 模型不保存

python - 使用 ctypes 模块访问用 C 编写的 DLL 时出错

python - Google Colab 中的斯坦福 OpenIE

javascript - Django - 用户限制访问相同的值

python - 如何在单击按钮时调用 Django 函数?

javascript - HTML - 从远程在线 CSV 文件访问数据