如何从模型中获取字段数据?
假设我有一个叫做app的Django应用。在这个应用里,我在models.py文件中定义了一个模型类,叫做data。同时,我在模板目录下有一个html文件,里面有几个下拉列表,这些下拉列表应该用模型中的字段来填充,比如类型(type)、日期(date)。
我需要做的是在views.py文件中获取这些字段的列表,并用它们来填充下拉列表。还有一点是,当用户通过选择下拉列表中的值来提交查询后,我会展示一个表格,显示模型中所有字段的值。所以基本上,我需要获取用户输入的内容,根据这个输入进行查询,然后根据查询结果获取模型中所有字段的数据。我们可以再加两个字段,时间(time)和数值(value)。这些操作大部分都应该在views.py中完成。
这是html文件中的下拉列表:
<form action="" method="post">
<select name="type" values="type_data"></select>
<select name="date" values="date_data"></select>
<input type="submit" value="Submit">
</form>
我尝试做的两件事是:
1. 为了获取数据来填充下拉列表,我使用了:
objects= data.objects.all()
type_data=getattr(objects, 'type')
date_data=getattr(objects, 'date')
2. 为了在查询后获取数据,我使用了:
if request.method == 'POST':
…
mytype = '% r' % request.POST.get['type']
mydate = ' %r ' % request.POST.get['date']
objects2= data.objects2.filter(type=mytype,date=mydate)
time=getattr(objects2, 'time')
value=getattr(objects2, 'value')
但是这些都没有成功。我参考了这个链接 django object get/set field,所以我基本上是用这个方法来获取模型字段的数据:getattr(obj, 'field_name')
有什么想法吗?我非常感谢任何帮助。
2 个回答
你的 objects
变量是一个查询集,简单来说就是一堆对象的集合。当你把它变成“具体的东西”时,就变成了一份对象列表。所以,如果你想获取这些对象的属性,就需要逐个遍历它们:
objects = data.objects.all()
type_data = []
date_date = []
for obj in objects:
type_data.append(obj.type)
date_date.append(obj.date)
不过我想你真正需要的是为下拉框中的每个值准备一个ID(但我可能错了):
for obj in objects:
type_data.append((obj.pk, obj.type))
date_date.append((obj.pk, obj.date))
这样会创建一个包含多个元组的列表:
[(1, 'value1'), (2, 'value2')...]
所以在模板中你可以使用:
<select name="type">
{% for value, name in type_data %}
<option value="{{ value }}">{{ name }}</option>
{% endfor %}
</select>
不过要记住,Django可以简化这个过程——可以了解一下表单的相关内容。
看看 Django的表单 功能,特别是 ModelChoiceField,它可以解决这个问题。
如果你想查看一个模型里有哪些字段,可以看看 model._meta.fields
。
比如,下面的代码会打印出模型实例 instance
中每个字段的值:
for field in instance._meta.fields:
print field.attname, '=', getattr(model, field.attname)