django-templates template教程 - 在django模板中创建大写的第一个字母




template大于 2.0教程 (5)

我从数据库中提取一个名称,该数据库存储为myname 。 如何在Django模板中将Myname显示为Myname ,第一个字母为大写。


Answers

title过滤器工作正常,但如果你有一个多字的字符串,如: "some random text" ,结果将是"Some Random Text" 。 如果你真正想要的只是大写整个字符串的第一个字母,你应该创建自己的自定义过滤器。

您可以创建这样的过滤器(按照如何从此doc创建自定义模板过滤器的说明 - 这很简单):

# yourapp/templatetags/my_filters.py
from django import template

register = template.Library()

@register.filter()
def upfirstletter(value):
    first = value[0] if len(value) > 0 else ''
    remaining = value[1:] if len(value) > 1 else ''
    return first.upper() + remaining

然后,您应该在模板中加载my_filters文件,并使用在那里定义的过滤器:

{% load my_filters %}

...
{{ myname|upfirstletter }}

使用Django内置的模板过滤器名为title

{{ "myname"|title }}

如果您有多个单词(例如全部大写),此解决方案也有效:

{{ "ALL CAPS SENTENCE"|lower|capfirst }}

这将输出“全部大写句子”。


我知道有点晚了,但你可以使用capfirst

{{ "waiting for action"|capfirst }}

这将导致“等待行动”


这是一个类似于上面的do_setdo_get模板标签答案的轻量级解决方案。 Django允许你将整个模板上下文传递给一个标签,它可以让你定义一个全局变量。

base.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
  {% block head %}
    <title>{{ title }}</title>
  {% endblock %}
</head>
<body>
  <h1>{{ title }}</h1>
</body>
</html>

page.html中:

{% extends "base.html" %}

{% block head %}
  {% define 'title' 'Homepage | title' %}
  {{ block.super }}
{% endblock %}

自定义标签(这里有个想法: https://.com/a/33564990/2747924 : https://.com/a/33564990/2747924 ):

@register.simple_tag(takes_context=True)
def define(context, key, value):
    context.dicts[0][key] = value
    return ''

另外,不要忘记{% load %}您的自定义标签或将它们添加到模板选项builtins列表中,这样您就不必在每个模板中加载它们。 此方法的唯一限制是必须从块标记内调用{% define %} ,因为子模板只会呈现与父标记匹配的块标记。 不知道是否有解决方法。 还要确保在尝试define使用define call之前。





django django-templates