django如何循环通过通用detailview传回的上下文对象?

Posted

技术标签:

【中文标题】django如何循环通过通用detailview传回的上下文对象?【英文标题】:django how to loop through the context object passed back by a generic detailview? 【发布时间】:2011-10-05 07:14:00 【问题描述】:

我正在使用通用 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>

我尝试了上面的sn-p,得到了这个错误:

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

【问题讨论】:

【参考方案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>

【讨论】:

这很酷。按照这种方法,您将如何处理选择?像这样的东西:ppr_tv_usages = models.IntegerField('Project Payment Responsibilities TV Usages', choices=PPR_CHOICES) 对于需要调用 get_FOO_display() 而不是 field.value_to_string(self) 的选择。当然有更好的方法可以做到这一点,但改变上面的 get_field_values 以检查 meta 中的每个字段是否有选择,如果是这样,调用类似 getattr(self,"get_%s_display" % field.name)() 的方法会起作用。希望有帮助!

以上是关于django如何循环通过通用detailview传回的上下文对象?的主要内容,如果未能解决你的问题,请参考以下文章

Django 通用视图:何时使用 ListView 与 DetailView

将 Pk 或 Slug 传递给 Django 中的通用 DetailView?

将用户名传递给通用 DetailView 时出错 - django 1.4.3

Django Generic Views:教程中,DetailView如何自动提供变量?

DetailView 使用两个 ForeignKey kwargs

django按类别列出,带有indexview和detailview类