1-ORM获取字段名
About
在Django中,有的时候,我们试图展示某个表的所有记录,但是我们需要手动写各个字段名字,如果有很多字段名的话,这样就比较麻烦了,那么我们能不能从Django的orm中自动的获取各个字段名字?答案是可以的。
实现
在models.py
class ProjectManage(models.Model):
""" 项目管理表 """
project_name = models.CharField(max_length=255, default='', verbose_name='项目名称')
project_num = models.CharField(max_length=255, default='', verbose_name='项目代号')
project_start_time = models.DateField(default='', verbose_name='项目开始时间')
project_stop_time = models.DateField(default='', verbose_name='项目结束时间')
project_type = models.ForeignKey("ProjectType", on_delete=models.CASCADE, default='', verbose_name='项目类型')
project_detail = models.CharField(max_length=2048, default='', verbose_name='项目描述')
如上示例中,在models.py
中是这样的,我们想自动的循环展示各个字段的verbose_name
,这样就省事儿不用写啦!
那么在views.py
中,我们可以这样做:
from django.shortcuts import render, redirect, HttpResponse
from web import models
def index(request):
fields = models.ProjectManage._meta.fields # 取出各个字段名
print(fields)
project_obj = models.ProjectManage.objects.all()
if project_obj: # 如果queryset不为空
return render(request, 'index.html', {'project_obj': project_obj, 'fields': fields})
else:
return render(request, 'index.html', {'project_obj': ''})
在前端的模板渲染中,可以这么写:
<div class="container">
<div class="row">
<div class="col-md-10">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<!-- 原来是自己写字段名 -->
<!--
<th>项目名称</th>
<th>项目代号</th>
<th>项目开始时间</th>
<th>项目结束时间</th>
<th>项目类型</th>
<th>项目描述</th>
<th>项目状态</th>
-->
<!-- 现在这么玩就可以了 -->
{% for field in fields %}
<th>{{ field.verbose_name }}</th>
{% endfor %}
<!-- 再有其他的操作,自己可以添加 -->
<th>操作</th>
</tr>
</thead>
<tbody>
{% for foo in project_obj %}
<tr>
<td>{{ foo.project_name }}</td>
<td>{{ foo.project_num }}</td>
<td>{{ foo.project_start_time | date:"Y-m-d" }}</td>
<td>{{ foo.project_stop_time | date:"Y-m-d" }} </td>
<td>{{ foo.project_type }}</td>
<td>{{ foo.project_detail }}</td>
{% if foo.project_status %}
<td>已执行</td>
{% else %}
<td>未执行</td>
{% endif %}
<td>
<a class="btn btn-danger btn-sm" href="/manage_delete/{{ foo.id }}">删除</a>
<a class="btn btn-default btn-sm" href="/manage_edit/{{ foo.id }}">编辑</a>
{% if foo.project_type.project_type == "接口测试" %}
<a href="/md_add/{{ foo.id }}" class="btn btn-success btn-sm">新增模块</a>
{% if foo.projectmodel_set.all %}
<a href="/md_list/{{ foo.id }}" class="btn btn-dropbox btn-sm">查看模块</a>
{% endif %}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>