#django #python-3.x
#django #python-3.x
Вопрос:
Я пишу приложение django, и мне нужно получить доступ к полю дочерних объектов в admin и шаблонах: мои модели:
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>]
Как я могу избавиться от «[ < Person:….> ]» и просто отобразить имя?
Также как я могу изменить заголовок поля getGuardian на странице администратора?
Комментарии:
1. Я не знаю, просто ли код неправильно скопирован, но второй метод __str__() не предназначен должным образом, поэтому он теперь не принадлежит модели
2. просто скопируйте и вставьте, я не могу указать идентификатор здесь 🙂
3. Что вы имеете в виду, вы не можете? Вы должны, иначе строковое представление модели было бы общим, что является вашей проблемой atm.
Ответ №1:
Во-первых, если вы не хотите, чтобы оно отображалось в скобках []
, вам нужно вернуть один объект вместо списка. Если запрос для guardian всегда будет возвращать один элемент, вы могли бы сделать что-то вроде
def getGuardian(self):
guardian = self.person_set.get(membership=1)
return guardian
И 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)