模板上的属性不起作用

时间:2014-09-24 11:06:16

标签: django templates properties

根据答案:Can model properties be displayed in a template,我正在尝试制作属性,可以在模板上显示:

class MyClass(models.Model):
  first_name = models.CharField(max_length = 10)
  last_name = models.CharField(max_length = 10)

  def __unicode__(self):
    return "%s %s" % (self.first_name, self.last_name)

  @property
  def initials(self):
    return "%s.%s." % (self.first_name[0:1], self.last_name[0:1])

也尝试过:

 def _get_initials(self):
    return "%s.%s." % (self.first_name[0:1], self.last_name[0:1])

 initials = self._get_initials()

和模板:

{% for i in people %}
  {{ i.initials }}
{% endfor %}

但结果是空字符串

我将模板更改为:

{% for i in people: %}
  {{ i.instance.initials }}
{% endfor %}

但仍然是空字符串。

如果我使用:

{% for i in people: %}
  {{ i }}
{% endfor %}

我收到 unicode 结果,因此模型,表单和模板都是正确的

请不要专注于解决首字母问题,因为我需要属性来处理更复杂的任务 - 这只是一个例子。

更新

我添加了@property,因为它没有用,所以我一直在寻找解决方案......

2 个答案:

答案 0 :(得分:0)

嗯......非常感谢Daniel Roseman指点我。该属性不需要,实例也是:正确的答案是:

class MyClass(models.Model):
  first_name = models.CharField(max_length = 10)
  last_name = models.CharField(max_length = 10)

  def __unicode__(self):
    return "%s %s" % (self.first_name, self.last_name)

  def initials(self):
    return "%s.%s." % (self.first_name[0:1], self.last_name[0:1])

也尝试过:

和模板:

{% for i in people %}
  {{ i.initials }}
{% endfor %}

我的问题是在其他地方定义 - 我需要函数来制作名称的md5hash:

def hashed(self):
  hashed = md5.new("%s" % self.first_name).digest()
  return "%s md5(%s)" % (self.first_name, hashed)

但是有一个错误 - 它必须是hexdigest()而不是digest()。但最大的困惑是,即使出现此错误,我也希望看到Smith md5()而不是Smith md5(skljhghwgohwgio2534),但我什么也看不到......,误导我的是,问题在于函数和模板没有返回值。 ..

这对我来说是一个教训 - 小步骤,如果某些事情不起作用,请检查更简单的案例......

答案 1 :(得分:0)

所以我遇到了同样的问题。不幸的是,Django不会告诉您模型上的属性或函数是否有错误。它不会显示任何内容。如果遇到此问题,请尝试从其他位置调用要显示的函数或方法,例如MyModel.some_property,查看该属性是否返回您期望的数据。