在模板if语句中使用Django TextChoices字段而无需硬编码

bvjxkvbb  于 2023-05-01  发布在  Go
关注(0)|答案(2)|浏览(130)

给定一个模型,如

class Foo(models.Model):
   class FooTypes(models.TextChoices):
      OK = "F", "Ok"
      BAR = "B", "FooBared!"
   foo_type = models.CharField(max_length = 1, 
                               choices = FooTypes.choices)

如何在使用FooTypes的模板中使用IF语句。OK或FooTypes。BAR(而不是硬编码“F”或“OK”等)).
比如说

{% if item.foo_type == FooTypes.OK %}
...
{% endif %}
sd2nnvve

sd2nnvve1#

我不确定这是否是正确的方法,但是你可以通过上下文传递FooTypes

'foo_types': FooTypes

现在

{% if t.foo_type == foo_types.OK %}
zvokhttg

zvokhttg2#

这是一个相当冗长的声明,为什么不在字段定义中显式地声明选项,如:

type_field = models.CharField(
        max_length=MAX_TYPE_LENGTH,
        choices=(
            ("foo", "FOO"),
            ("bar", "BAR"),
            ("baz", "BAZ"),
        ),
        default="foo",
    )

然后,您可以在每个元组的第一项上使用Django模板过滤器,这是存储在db中的名称。例如:

{% if obj.type == "foo" %}
...
{% elif obj.type == "bar" %}
...
{% elif obj.type == "baz" %}
...
{% endif %}

在模板中改变选择的显示值就像改变选择元组的第二个值一样简单。例如,从“foo”到“fooBaz”需要更改行:

("foo", "foo") -> ("foo", "fooBaz")

相关问题