可以在Django {%ifequal%}表达式中使用带有查找的变量吗?

时间:2012-05-01 08:03:34

标签: python django django-templates

这是我的代码:

[{{thing.syncedthing_set.all.0.state}}]
{% ifequal thing.syncedthing_set.all.0.state "InProgress" %}
    It worked
{% endifequal %}

结果:

[InProgress]

换句话说,变量查找有效,但没有通过'ifequal'测试。我想不出有什么理由除了不支持变量查找之外不行。

2007年有一条邮件列表消息说他们当时不受支持:https://groups.google.com/forum/?fromgroups#!topic/django-users/oU1im3UTcLc - 情况仍然如此吗?

如果是这样,有什么好的解决方法吗?在这种情况下修改调用模板的Python代码并不容易。

如果他们应该工作 - 任何其他可能的原因?

this very similar question,但答案对我不起作用。我正在使用Django 1.3。

修改

好的,所以'state'有类型类。查找定义,state指的是一个最终子类化models.Field:

的类
class FSMField(models.Field):
    __metaclass__ = models.SubfieldBase

    states = {}
    """ Contains { 'Statename': StateClass, ... }"""

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('max_length', 50)
        super(FSMField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if isinstance(value, State):
            return value
        return self.__class__.states.get(str(value))()

    def get_prep_value(self, value):
        return str(value)

    def get_internal_type(self):
        return 'CharField'

鉴于此 - 我实际上不确定如何在模板系统中获得真正的字符串值。原谅我的新生事。

EDIT2 实际上,相关位可能是“国家”类本身:

class State(object):
    """ A simple finite statement machine abstract class, with on_entry and on_exit events."""
    def __unicode__(self):
        return "%s" % (self.__class__.__name__)

    def __str__(self):
        return "%s" % (self.__class__.__name__)

2 个答案:

答案 0 :(得分:2)

对象的字符串表示与实际字符表示之间存在差异。您的state属性似乎可能返回其unicode表示为InProgress的对象,但这并不会使其实际上等于"InProgress"。例如,如果state是另一个模型的ForeignKey,则会出现这种情况 - 在这种情况下,您可以在查找中添加另一个级别,以获取返回该状态的实际字段。

更新后修改不幸的是,我认为你已将自己编入角落。由于没有实际的实例属性将状态包含为字符串,因此无法通过字符串比较来获取它。

有几种可能性浮现在脑海中。一种是将所有可能的State子类传递给模板上下文(可能通过上下文处理器),之后您将能够将state与实际对象进行比较。这太可怕了。

另一种方法是在State类或可能在模型上添加一个函数,该函数将状态作为字符串。这可能与现有的__unicode__方法一样简单(您实际上无法使用它,因为模板语言禁止访问以下划线开头的属性)。然后你可以ifequal foo.bar.0.state.as_string "InProgress"或其他什么,这会调用as_string()方法,你的比较就会成功。

答案 1 :(得分:0)

尝试使用IF:

{% if thing.syncedthing_set.all.0.state == "InProgress" %}