Попытка отформатировать возвращенный _set

#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__ Вместо этого вы можете использовать метод.