首页 > 解决方案 > 我在 Django 模型类中定义了常量。如何访问模板中的常量?

问题描述

我有一个带有选择字段的模型类,其可能的值定义为常量,如https://docs.djangoproject.com/en/3.0/ref/models/fields/#choices中所建议的那样

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    YEAR_IN_SCHOOL_CHOICES = [
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
    ]
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

在常规 Python 代码中(例如在视图中),我可以轻松地使用如下常量:

if my_student.year_in_school == Student.FRESHMAN:
    # do something

我的问题是:我也可以在模板中做这样的事情吗?就像是

{% if student.year_in_school == Student.FRESHMAN %}
    Welcome
{% endif %}

...如果我在模板中硬编码值“FR”,这可行,但这违背了常量的目的......

(我正在使用 Python 3.7 和 Django 3.0)

标签: djangodjango-modelsdjango-templatesmodelchoicefield

解决方案


除了显式地将它们传递给您的模板之外,模板无法获取这些值,如果您走这条路,您有两个选择:传递Student给您的模板渲染上下文,或使用上下文处理器将其自动添加到您的模板上下文

更好的方法是向该类添加一个方法,因此您不需要Student在模板中使用常量,例如:

class Student(models.Model):
    ...
    @property
    def is_freshman(self):
        return self.year_in_school == self.FRESHMAN

并直接在您的模板中使用它:

{% if student.is_freshman %}
    Welcome
{% endif %}

推荐阅读