0

我有一个使用 model_utils.Choices 的 CharField 模型:

from model_utils import Choices

class UserTestStatistics(models.Model):
TEST_STATUSES = Choices(
    ('NR', 'not_readed'),('NP', 'not_passed'),
    ('FL', 'failed'), ('PD', 'passed'),        
)
status = models.CharField(choices=TEST_STATUSES, max_length=2)

在模板中,我想根据状态字段中的值添加自定义 css 类。我试过这个:

{% if lecture.status == 'NP' %}
    label-warning
{% endif %}

这没有用。然后我尝试了这个:

context['statuses'] = UserTestStatistics.TEST_STATUSES

{% elif lecture.status == statuses.not_passed %}
    label-warning
{% endif %}

它也失败了。这就是为什么:

>>> s = UserTestStatistics.objects.get(lecture=l)
>>> type(s.status)
<type 'unicode'>
>>> type(UserTestStatistics.TEST_STATUSES.passed)
<type 'str'>

快速而肮脏的解决方案是添加自定义模板标签,将两者都转换为 uncode 然后进行比较,但对我来说,它看起来好像我错了。

任何人都可以请建议更漂亮的东西吗?

4

2 回答 2

2

我更喜欢拥有属性而不是在模板上使用硬编码字符串的方法。

@property
def is_not_readed(self):
    return self.status == UserTestStatistics.TEST_STATUSES.STATUS.NR

因此,在您的模板中:

{% if lecture.is_not_readed %}
    label-warning
{% endif %}

或者,您可以将 TEST_STATUSES 作为

Choices('draft', 'published')
class UserTestStatistics(models.Model):
    TEST_STATUSES = Choices('not_readed', 'not_passed', 'failed', 'passed')
...

所以,在模板中:

{% if lecture.status = lecture.TEST_STATUSES.not_readed %}
    label-warning
{% endif %}

请记住,就重构和易读性而言,在模板上使用魔术“字符串”并不是很好的想法。

我希望这可以帮助一些人。或者,如果您有不同的想法/方法,请让每个人都知道。

于 2016-01-27T18:40:22.873 回答
0
 def __unicode__(self):
    return self.status
于 2013-02-08T08:35:12.223 回答