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如何自动提供变量?