我正在编写一个django应用程序,我需要访问admin和templates中的子对象字段: 我的模特:
class House(models.Model):
doc_code = models.IntegerField()
...
def getGuardian(self):
guardian = self.person_set.filter(membership=1)
return guardian
def __str__(self):
return "Family: " + str(self.doc_code)
class Person(models.Model):
family = models.ForeignKey(House)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
...
def __str__(self):
return self.last_name + ' ' + self.first_name
在视图中:
houses = House.objects.order_by('doc_code')
模板中的:
<li>{{house.doc_code}} {{house.getGuardian}}</li>
我收到:
1 [<Person: Smith John>]
如何摆脱“[&lt; Person:....&gt;]”并只显示名称? 另外如何在管理页面中更改字段getGuardian的标题?
答案 0 :(得分:1)
首先,如果您不希望它显示在括号[]
中,则需要返回单个对象,而不是列表。如果监护人的查询将始终返回单个成员,您可以执行类似
def getGuardian(self):
guardian = self.person_set.get(membership=1)
return guardian
守护者将是一个Person
对象。
其次,要将代表从<Person: Smith John>
更改为仅Smith John
,您应该自定义模型的__repr__
方法,而不是__str__
方法:
def __repr__(self):
return self.last_name + ' ' + self.first_name
我不确定你是否真的想这样做,因为它会使这些对象显示为字符串,在某些情况下这可能会产生误导,但这取决于你。你可能最好在你的视图中获取监护人的名字并将其传递给上下文,或者让getGuardian
返回监护人的姓名开头:
def getGuardianName(self):
guardian = self.person_set.get(membership=1)
return str(guardian)