Переписать шаблон Django {% for%} в метод Model - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть существующий код, который работает:

{% for author in seminar.authors.all %}
{{ author.first_name}} {{ author.last_name }}
{% if forloop.last %}{% else %}, {% endif %}
{% endfor %}

Как вы уже догадались, seminar.authors - это поле m2m.Общий, ничего особенного.

Я знаю, как писать методы Model, но я не уверен, как правильно выполнить цикл по каждому элементу автора для каждого объекта семинара и применить запятую, если текущая итерация почти последняя.

Было бы хорошо назвать этот метод модели get_author_display?Я не уверен, что если это противоречит встроенному в Django get_*_display.

, я бы хотел поддержать несколько условий forloop.last:

  • 1 имя автора = нетзапятая или "и"
  • 2 имени автора = запятая
  • 3 или более имени автора = запятая w / "и" с предшествующим фамилией автора.

нов элегантной манере.Идеи?

1 Ответ

1 голос
/ 15 апреля 2011

Вы уверены, что ваше второе дополнительное требование верно?Конечно, с двумя именами, которые вы хотите "и" и без запятой?

В любом случае, в этом нет ничего особенно сложного.Хитрость заключается в том, чтобы сначала получить длину набора запросов - обратите внимание, что на самом деле здесь более эффективно использовать len, а не .count(), поскольку count() в неоцененном наборе запросов выполняет отдельный вызов базы данных.

def get_author_display(self):
    authors = self.authors.all()
    length = len(authors)
    output = []
    for i, author in enumerate(authors):
        val = "%s %s" % (author.first_name, author.last_name)
        if i == (length-1) and length > 2:
             val = "and " + val
        output.append(val)
    return ', '.join(output)

И нет, нет ничего плохого в вызове метода, который: authors никогда не установит CHOICES, поэтому не получит автоматический метод get_foo_display.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...