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)的主要内容,如果未能解决你的问题,请参考以下文章