我正在尝试创建一个基本模板来显示所选实例的字段值及其名称。可以将其看作是该实例的值以表格格式的标准输出,其中字段名称(如果在字段上指定,则为verbose_name)位于第一列,该字段的值位于第二列。
例如,假设我们有以下模型定义:
class Client(Model):
name = CharField(max_length=150)
email = EmailField(max_length=100, verbose_name="E-mail")
我希望它在模板中像这样输出(假设一个实例具有给定值):
Field Name Field Value
---------- -----------
Name Wayne Koorts
E-mail waynes@email.com
我试图实现的是能够将模型的实例传递给模板,并能够在模板中动态地迭代它,就像这样:
<table>
{% for field in fields %}
<tr>
<td>{{ field.name }}</td>
<td>{{ field.value }}</td>
</tr>
{% endfor %}
</table>
有没有一种整洁的,“Django批准的”方法来做到这一点?这似乎是一项非常常见的任务,对于这个特定的项目,我需要经常这样做。
发布于 2010-01-31 09:54:53
model._meta.get_all_field_names()
将为您提供模型的所有字段名,然后您可以使用model._meta.get_field()
获取详细名称,使用getattr(model_instance, 'field_name')
从模型中获取值。
注意: django 1.9中不推荐使用model._meta.get_all_field_names()
。相反,使用model._meta.get_fields()
来获取模型的字段,使用field.name
来获取每个字段的名称。
发布于 2010-08-08 00:13:18
我在the dev mailing list上找到了一个很好的解决方案
在视图中添加:
from django.forms.models import model_to_dict
def show(request, object_id):
object = FooForm(data=model_to_dict(Foo.objects.get(pk=object_id)))
return render_to_response('foo/foo_detail.html', {'object': object})
在模板中添加:
{% for field in object %}
<li><b>{{ field.label }}:</b> {{ field.data }}</li>
{% endfor %}
发布于 2010-02-09 09:29:03
这里是使用模型方法的另一种方法。此版本解析选择列表/选项字段,跳过空字段,并允许您排除特定字段。
def get_all_fields(self):
"""Returns a list of all field names on the instance."""
fields = []
for f in self._meta.fields:
fname = f.name
# resolve picklists/choices, with get_xyz_display() function
get_choice = 'get_'+fname+'_display'
if hasattr(self, get_choice):
value = getattr(self, get_choice)()
else:
try:
value = getattr(self, fname)
except AttributeError:
value = None
# only display fields with values and skip some fields entirely
if f.editable and value and f.name not in ('id', 'status', 'workshop', 'user', 'complete') :
fields.append(
{
'label':f.verbose_name,
'name':f.name,
'value':value,
}
)
return fields
然后在您的模板中:
{% for f in app.get_all_fields %}
<dt>{{f.label|capfirst}}</dt>
<dd>
{{f.value|escape|urlize|linebreaks}}
</dd>
{% endfor %}
https://stackoverflow.com/questions/2170228
复制相似问题