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'>

手っ取り早い解決策は、両方をアンコードに変換してから比較するカスタム テンプレート タグを追加することですが、私にとってはどこか間違っているように見えます。

誰かもっときれいなことをアドバイスできますか?

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 に答える