django, как перебрать объект контекста, переданный обратно общим представлением деталей?

Я использую общий вид DetailView для отображения объекта проекта. Могу ли я как-то перебрать поля в своем шаблоне или мне нужно разместить каждое поле.

url(r'^(?P<slug>[-\w]+)/$', DetailView.as_view(model=Project,
                                               template_name='projects/detail_project.html',slug_field='slug',
                                                context_object_name='project'), name='project_detail'),

У меня есть что-то вроде этого в моем шаблоне:

{{ project.title }}
{{ project.created_date }}

так далее...

Есть ли способ сделать что-то подобное?

    <table>
        {% for field in project %}
            <tr>
                <td>{{ field }}</td>
            </tr>
        {% endfor %}
    </table>

Я попробовал приведенный выше фрагмент и получил эту ошибку:

Caught TypeError while rendering: 'Project' object is not iterable

person darren    schedule 14.07.2011    source источник


Ответы (1)


Обычно лучше размещать каждое поле, но если вы просто хотите сбросить все поля, вы можете сделать что-то вроде:

# models.py
class Project(models.Model):
    ...

    def get_field_values(self):
        return [field.value_to_string(self) for field in Project._meta.fields]

тогда вы могли бы сделать

<table>
    {% for value in project.get_field_values %}
        <tr>
            <td>{{ value }}</td>
        </tr>
    {% endfor %}
</table>
person JamesO    schedule 14.07.2011
comment
Это очень круто. Как бы вы справились с выбором, следуя такому подходу? Что-то вроде этого: ppr_tv_usages = models.IntegerField('Project Payment Responsibilities TV Usages', choices=PPR_CHOICES) - person darren; 14.07.2011
comment
для выбора вам нужно будет вызвать get_FOO_display(), а не field.value_to_string(self). Конечно, есть лучший способ сделать это, но изменив get_field_values ​​выше, чтобы проверить, есть ли у каждого поля в meta варианты выбора, и если да, вызов чего-то вроде getattr(self,get_%s_display % field.name)() будет работать. Надеюсь, это поможет! - person JamesO; 15.07.2011