#python #django #django-models #django-templates
#python #django #django-модели #django-шаблоны
Вопрос:
Я пытаюсь заполнить свою форму списком планов.
Вот мой юникод для модели планов
def __unicode__(self):
label = "ID: %s, Member(s): %s, Plan Type: %s" % (self.id, self.get_owners(), self.plan_type)
return unicode(label)
Теперь я вызываю get_owners, который показан ниже:
def get_owners(self):
owners = self.planmember_set.filter(ownership_type__code__in=["primary","joint"])
return owners
Но мой вывод показывает:
[<PlanMember: Name, [membership_type]><PlanMember: Name, etc etc>]
Как мне отобразить выходные данные без скобок и многое другое в соответствии с:
Name [membership_type], Name [membership_type], etc
Ответ №1:
Вы просто возвращаете необработанный набор get_owners
запросов, и Python вызывает repr()
его, чтобы вставить его в строку.
Лучше всего сделать форматирование внутри get_owners
:
def get_owners(self):
owners = ...
return u", ".join(unicode(o) for o in owners)
Комментарии:
1. Я показываю эту ошибку, когда пытаюсь это сделать:
Caught TypeError while rendering: sequence item 0: expected string, PlanMember found
Ответ №2:
Ваш get_owners
метод делает именно то, что он должен делать: возвращает набор владельцев. Затем в вашем шаблоне вы можете перебирать этих владельцев и отображать их так, как вам нравится:
{% for owner in plan.get_owners %}
{{ owner }}
{% endfor %}
Или, внутри другого кода python, вы можете скомпоновать его в строку, как вам нравится:
def __unicode__(self):
owners = u', '.join(self.get_owners())
label = "ID: %s, Member(s): %s, Plan Type: %s" % (self.id, owners, self.plan_type)
return unicode(label)
Методы модели не должны принудительно отображать; они должны возвращать только данные. (За исключением очевидных исключений, таких как __unicode__
, которые конкретно касаются отображения модели в виде текста в Юникоде.)
Комментарии:
1. Я получаю ту же ошибку, что и с ответом Дэниелса. Я понимаю, что вы можете выполнять цикл по шаблону, но что, если вы пытаетесь заполнить поле формы, а не просто отображать информацию в шаблоне?
Ответ №3:
Похоже, вам нужно добавить __unicode__
метод PlanMember
, как вы сделали для Plan
.
def __unicode__(self):
label = "Name: %s, [%s]" % (self.name, self.membership_type)
return unicode(label)
Комментарии:
1.
__repr__
Вместо этого вы можете использовать метод.