我的代码是:
[{{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__)
尝试在以下情况下使用:
对象的字符串表示和它的实际情况是有区别的。似乎您的
state
属性返回一个unicode表示为InProgress
的对象,但这并不意味着它实际上等于"InProgress"
。例如,如果state
是另一个模型的外键-在这种情况下,您可以在查找中添加另一个级别,以获得返回该状态的实际字段。在更新后编辑很不幸,我觉得你把自己逼到了一个角落。由于没有实际的实例属性将状态作为字符串包含,因此无法通过字符串比较来获取状态。在
脑海中浮现出两种可能性。一种方法是将所有可能的
State
子类传递给模板上下文(可能通过上下文处理器),之后您将能够将您的state
与实际对象进行比较。这太可怕了。在另一种方法是在
State
类或模型上添加一个函数,该函数以字符串形式获取状态。这可以像现有的__unicode__
方法一样简单(实际上不能使用它,因为模板语言禁止访问以下划线开头的属性)。然后您可以执行ifequal foo.bar.0.state.as_string "InProgress"
或其他操作,这将调用as_string()
方法,您的比较将成功。在相关问题 更多 >
编程相关推荐