Queryset contenttype在模板表

时间:2018-01-24 19:46:55

标签: python django content-type

我有一个视图,它接收用户通过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>

事情是,我没有得到结果,或者如果我更改模板内的标签,我得到每一行的对象字典。

如何实现我需要的任何想法?,提前谢谢。

1 个答案:

答案 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实例。