【发布时间】:2016-10-29 20:49:16
【问题描述】:
我有几个通过外键链接的数据库表(您必须原谅这里的基本示例,我现在无法从我的开发环境中复制/粘贴)。
# models.py
class Task(models.Model):
details = models.ForeignKey(Details)
task = models.CharField(max_length=1024, null=false)
class Activity(models.Model):
task = models.ForeignKey(Task)
activity = models.CharField(max_length=1024)
class Resources(models.Model):
activity = models.ForeignKey(Activity, null=false)
resources = models.CharField (max_length=1024)
我需要在一个表格中显示这些结果。请注意,一个任务可以没有活动,一个活动可能没有任何资源等。例如:
- 任务1
- 活动1
- 资源1
- 资源2
- 活动2
- 活动1
- 任务2
- ...等等...
到目前为止,我已经在 forms.py 中创建了一个表,其中包含所有可能出现在数据库结果中的字段。所以:
# forms.py
class ViewTable(tables.Table):
task = tables.Column(default=' ')
activity = tables.Column(default=' ')
resource = tables.Column(default=' ')
然后我使用itertools.chain 将结果以正确的顺序链接在一起,然后将它们呈现到模板中。我在这里陷入了死胡同:
# views.py
table = None
for task in tasks:
if table:
table = list(chain(table, task)
else:
table = task
for activity in Activities.objects.filter(tasks=task):
table = list(chain(table, activity))
for resource in Resources.objects.filter(activity=activity):
table = list(chain(table, resource))
return render(request, 'table.html', {'table', table, })
# table.html
<table>
<tr>
<th>Tasks</th>
<th>Activity</th>
<th>Resources</th>
</tr>
{% for item in table %}
<tr>
<th>{{ item.task }}</th>
<th>{{ item.activity }}</th>
<th>{{ item.resource }}</th>
</tr>
{% endfor %}
</table>
这不起作用,因为如果我只有一个任务(并且没有活动或资源),那么该对象是不可迭代的,所以当我尝试在模板中呈现它时出现错误。
但总的来说,我觉得这是一种草率而缓慢的做事方式,我很难想出更好的方法。欢迎修复或完全替代建议!
总体目标是获得如下所示的内容:
任务 活动 资源 ------------------------------------- 任务1 活动1 资源1 资源2 活动2 任务2【问题讨论】:
-
不知道为什么在这种情况下你会使用 django-tables2,看起来你在查看代码时根本不使用它。除此之外:如果你得到一个不能迭代的错误,你应该在尝试迭代它之前检查它是否是。
-
你说得对,我没有意识到
tables.Table是django-tables2的一部分。所以那部分是没有必要的。我的问题是如何想出我在“总体目标”中发布的内容。无论该对象是可迭代的(修复我拥有的代码)还是完全不同的解决方案,我都在听。 -
嗯,查看您的示例,有多个语法错误(
false与False,缺少括号)。请阅读如何提供minimal, complete, verifiable example 不需要提供完整的django项目,但是你的代码应该运行没有语法错误,视图应该是完整的,你的模型没有外部依赖... -
此外,如果您在使用 itertools 链构建东西时遇到困难,那么首先尝试创建一个简单的列表实现可能是明智的。对于您的应用程序而言,它可能不够快,但它应该能让您在优化之前深入了解问题。
-
你说得对,我不得不在没有语法高亮的情况下手动写出来,因为(正如我所指出的)我的虚拟机现在不能与 C&P 一起工作。似乎
false和False之间的区别让您从我的实际问题中分心,所以我将继续前进。感谢您的宝贵时间。
标签: python django django-templates html-table