Skip to content

About

在Django中,有的时候,我们试图展示某个表的所有记录,但是我们需要手动写各个字段名字,如果有很多字段名的话,这样就比较麻烦了,那么我们能不能从Django的orm中自动的获取各个字段名字?答案是可以的。

实现

models.py

python
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中,我们可以这样做:

python
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': ''})

在前端的模板渲染中,可以这么写:

html
<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>