根据答案: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,因为它没有用,所以我一直在寻找解决方案......
答案 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
,查看该属性是否返回您期望的数据。