Django 3:创建 CRUD 表模板(将上下文变量传递给 HTML)

Posted

技术标签:

【中文标题】Django 3:创建 CRUD 表模板(将上下文变量传递给 HTML)【英文标题】:Django 3: Creating a CRUD Table template (passing context variables to HTML) 【发布时间】:2021-02-13 05:51:47 【问题描述】:

我正在构建一个 Crud 表模板,因为用户有很多表要更新,并且我在将记录传递给模板时遇到了麻烦。这是我的看法:

def crud_table(request):
    user = request.user
    org = Organization.objects.filter(user=user)
    active_project = Project.objects.filter(organization=org[0],
                                            is_active=True)[0]
    assets = Asset.objects.filter(project=active_project)
    context_lbls = 'name': 'Name',
                    'asset_id': 'Asset ID',
                    'det_curve': "Deterioration Curve",
                    'class': 'Class',
                    'surface_type': 'Surface Type',
                    'Age': 'Age',
                    'AADT': 'AADT',
                    'AADTT': 'AADT',
                    'route': 'Bus Route',
                    'truck_route': 'Truck Route',
                    'Length': 'Asset Length',
                    'HCI': 'HCI'
                    

    context_data = 'name': Asset.objects.filter(project=active_project),
                    'asset_id': assets.asset_id,
                    'det_curve': assets.det_curve.name,
                    'class': assets.func_class.name,
                    'surface_type': assets.surface_type.name,
                    'Age': assets.age,
                    'AADT': assets.aadt,
                    'AADTT': assets.aadtt,
                    'route': assets.is_bus_route,
                    'truck_route': assets.is_truck_route,
                    'Length': assets.length,
                    'HCI': assets.hci
                    

    context = 'labels': context_lbls, 'records': context_data

这是我的模板:

<thead>
    <tr>
        <th>
            <span class="custom-checkbox">
                <input type="checkbox" id="selectAll">
                <label for="selectAll"></label>
            </span>
        </th>
        % for l in labels %
        <th>l</th>
        % endfor %
    </tr>
</thead>
<tbody>
    <tr>
        <td>
            <span class="custom-checkbox">
                <input type="checkbox" id="checkbox1" name="options[]" value="1">
                <label for="checkbox1"></label>
            </span>
        </td>
         records 
        % for r in records %
        <td>r</td>
        % endfor %
    </tr>
</tbody>

我的context_data 显然不正确,我只是不确定如何将信息传递给模板。我这样做是为了避免创建多个 html 文件和视图。那么将数据从 Django 推送到模板的理想方式是什么?

【问题讨论】:

【参考方案1】:

使用给定上下文渲染模板的最简单方法是使用render django 快捷方式:

from django.shortcuts import render
return render(request, 'form_template.html', context)

要遍历records,您应该以列表的格式提供它们,否则Django 将遍历records 字典中的键,这可能不是您想要的。

【讨论】:

感谢您的回答。我不确定我是否 100% 关注,你介意扩大一点吗?谢谢:) 我的意思是记录应该是一个列表,而不仅仅是一个字典。【参考方案2】:

在不完全确定您要做什么的情况下,您似乎想将一堆信息转储到一个表格中,每行旁边都有一个复选框。我没有测试过这段代码,但它可能接近你想要的:

from django.shortcuts import render

def crud_table(request):
    user = request.user
    org = Organization.objects.filter(user=user)
    active_project = Project.objects.filter(organization=org[0],
                                            is_active=True)[0]
    assets = Asset.objects.filter(project=active_project)
    context = 
        'records': [
            
                'id': 'name',
                'label': 'Name',
                'data': Asset.objects.filter(project=active_project),
            ,
            
                'id': 'asset_id',
                'label': 'Asset ID',
                'data': assets.asset_id,
            ,
            
                'id': 'det_curve',
                'label': 'Deterioration Curve',
                'data': assets.det_curve.name,
            ,
            
                'id': 'class',
                'label': 'Class',
                'data': assets.func_class.name,
            ,
            
                'id': 'surface_type',
                'label': 'Surface Type',
                'data': assets.surface_type.name,
            ,
            
                'id': 'age',
                'label': 'Age',
                'data': assets.age,
            ,
            
                'id': 'AADT',
                'label': 'AADT',
                'data': assets.aadt,
            ,
            
                'id': 'AADTT',
                'label': 'AADTT',
                'data': assets.aadtt,
            ,
            
                'id': 'route',
                'label': 'Bus Route',
                'data': assets.is_bus_route,
            ,
            
                'id': 'truck_route',
                'label': 'Truck Route',
                'data': assets.is_truck_route,
            ,
            
                'id': 'length',
                'label': 'Length',
                'data': assets.length,
            ,
            
                'id': 'HCI',
                'label': 'HCI',
                'data': assets.hci,
            ,
        ],
    
    
    return render(request, 'form_template.html', context)

<thead>
    <tr>
        <th>
            <span class="custom-checkbox">
                <input type="checkbox" id="selectAll">
                <label for="selectAll"></label>
            </span>
        </th>
        <th>
            Label
        </th>
        <th>
            Data
        </th>
    </tr>
</thead>
<tbody>
    % for record in records %
    <tr>
        <td>
            <span class="custom-checkbox">
                <input type="checkbox" id="checkbox1" name="options[]" value="1">
                <label for="checkbox1"></label>
            </span>
        </td>
        <td> record.label </td>
        <td> record.data </td>
    </tr>
    % endfor %
</tbody>

基本上我们所做的是将所有数据放入一个列表中,其中每个项目都是一个包含标签、数据和 id 字段的字典。然后在模板中,我们遍历记录列表并在表中为每个记录打印一行。

或者,您可以像以前一样遍历 dict 中的项目,但是您需要注意顺序,因为 Python dicts 没有保证顺序(至少,直到最近的 Python 版本) .要遍历 dict 的键,您可以执行 % for key, record in records.items % 之类的操作。

【讨论】:

以上是关于Django 3:创建 CRUD 表模板(将上下文变量传递给 HTML)的主要内容,如果未能解决你的问题,请参考以下文章

Django 通过 ORM 实现表的CRUD

Django 模板 - 更改“包含”模板的上下文

使用 Ajax、Django 将上下文传递到模板中

使用标记将 python 字符串插入 Django 模板上下文

Django:不能将变量传递给包含的模板?

处理 django 包含模板标签中的请求