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

2024-09-27 07:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码是:

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

结果是:

^{pr2}$

换句话说,变量查找有效,但是没有通过“ifequal”测试。除了不支持变量查找之外,我想不出还有什么原因不能使用。在

2007年的邮件列表中有一条消息说它们在当时不受支持:https://groups.google.com/forum/?fromgroups#!topic/django-users/oU1im3UTcLc-现在还是这样吗?在

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

如果它们应该起作用-还有其他可能的原因吗?在

this very similar question但答案对我不起作用。我用的是django1.3。在

编辑

好的,所以'state'有类型类。查找定义,state引用最终子类的类模型。字段公司名称:

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'

鉴于此,我实际上不知道如何在模板系统中获得真正的字符串值。原谅我的幼稚。在

编辑2 实际上,相关的位可能是“State”类本身:

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__)

Tags: 代码selfgetreturnvaluedefkwargsclass
2条回答

尝试在以下情况下使用:

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

对象的字符串表示和它的实际情况是有区别的。似乎您的state属性返回一个unicode表示为InProgress的对象,但这并不意味着它实际上等于"InProgress"。例如,如果state是另一个模型的外键-在这种情况下,您可以在查找中添加另一个级别,以获得返回该状态的实际字段。在

更新后编辑很不幸,我觉得你把自己逼到了一个角落。由于没有实际的实例属性将状态作为字符串包含,因此无法通过字符串比较来获取状态。在

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

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

相关问题 更多 >

    热门问题