【问题标题】:Django 3: Creating a CRUD Table template (passing context variables to HTML)Django 3:创建 CRUD 表模板(将上下文变量传递给 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 推送到模板的理想方式是什么?

【问题讨论】:

    标签: python-3.x django django-templates django-queryset


    【解决方案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 %} 之类的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-13
      • 2019-04-03
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多