我有一个视图,它接收用户通过post传递的模型和字段(当然在应用程序内部的现有模型和字段)并对其进行查询集过滤,然后我需要在我的模板中显示导致表格(名称字段必须是列标题)及其各自的值。
这是我到目前为止尝试序列化查询集结果,以便更容易在模板中显示:
Views.py:
from django.contrib.contenttypes.models import ContentType
class CommitteeReport(BaseView):
template_name = 'committee/committee_report.html'
def post(self, request, **kwargs):
myfield = request.POST['field'].lower()
my_model = request.POST['model'].lower()
queryset_obj = ContentType.objects.get(model = my_model).model_class().objects.filter(**{myfield:True})
return render(request, self.template_name,{
'requirements': queryset_obj,
})
我的模板:
<div class="tab-pane active" id="tab_1">
<table class="datatable table table-striped table-hover" cellspacing="0">
<thead>
<tr>
{% for key in requirements %}
<th>{{ key.fields.name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for item in requirements %}
<tr>{{ item.fields.value }}</tr>
{% endfor %}
</tbody>
</table>
</div>
事情是,我没有得到结果,或者如果我更改模板内的标签,我得到每一行的对象字典。
如何实现我需要的任何想法?,提前谢谢。
答案 0 :(得分:1)
您可以使用my_instance._meta.local_fields
获取模型字段列表。因此,您可以在return
之前的视图中尝试此操作:
if queryset_obj.exists():
fields = queryset_obj.first()._meta.local_fields
else:
fields = []
return render(request, self.template_name,{
'requirements': queryset_obj,
'fields': fields,
})
然后在模板中使用上下文变量fields
:
<table class="datatable table table-striped table-hover" cellspacing="0">
<thead>
<tr>
{% for field in fields %}
<th>{{ field.name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for req in requirements %}
<tr>
{% for field in fields %}
<td>{{ req|lookup:field.name }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
您可以在其中定义自定义lookup
模板过滤器以获取字段值:
def lookup(model, attr):
if hasattr(model, attr):
return getattr(model, attr)
else:
return None
注意:我假设所有requirements
都是相同的类并具有相同的结构,因此requirements.0
(QuerySet中的第一个对象)用于生成表的标题
注意2:我没有尝试过这个,你可能会将一些工作移到视图中,并将更容易的变量作为上下文变量传递(例如字段名称列表)。
注3:我没有添加错误处理,您应该检查model
实际上是Model
实例。