我是Django的新手,请多多包涵。我正在尝试创建一个列出类型为BP的JournalEntries的视图。该列表需要包括从LineItems中选择的与每个JournalEntry相关的值。每个type = BP的JournalEntry仅具有两个相关的LineItem。
models.py
Returns true if x is numerically zero, in any of the Calc data types. (Note that for some types, such as error forms and intervals,
views.py
ELISP> (math-zerop 0)
*** Eval error *** Symbol’s function definition is void: math-zerop
ELISP> (math-zerop 1)
*** Eval error *** Symbol’s function definition is void: math-zerop
我的模板journalentries_show_all.html
class JournalEntry(models.Model):
date = models.DateField(null=True, blank=False)
TYPE = (
('BP', 'Bank Payment'),
('YE', 'Year End'),
)
type = models.CharField(
max_length=2,
choices=TYPE,
blank=True,
default='0'
)
class LineItem(models.Model):
journal_entry = models.ForeignKey(JournalEntry, on_delete=models.PROTECT)
ledger = models.ForeignKey(Ledger, on_delete=models.PROTECT)
description = models.CharField(max_length=255, null=True, blank=True)
cr = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
dr = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
class Ledger(models.Model):
name = models.CharField(max_length=255)
在此特定视图中,我只想显示类型= BP的JournalEntries,所有这些都只有两个行项目。其他类型的JournalEntries具有更多的LineItem,但这些是在另一个视图中处理的。
答案 0 :(得分:0)
基本的Python迭代足以满足您的需求
results = []
for entry in journal_entries:
results.append(entry.lineitem_set.all()[2]
仅results
列表应该在context
中进行。 .all()[2]
将发送一个查询,其中前两个项目的数量限制。您将获得全部物品。选择您需要在模板中显示的内容,而不是视图。
为了使您的生活更轻松,您还可以在外键上定义一个related_name
属性,并在其中使用您想要的名称,而不是生成的*_set
答案 1 :(得分:0)
为什么要以字符串形式传递信息?这是不添加任何内容的额外步骤。您可以将整个字典作为context
变量来传递,因此我建议您这样做。在您看来,可以根据文档here中的过滤条件来请求行。然后,您可以将查询中的数据作为字典传递给模板。
为什么您的JournalEntry
模型只有一个字段?我们可以将JournalEntry
和LineItem
组合成这样的东西吗?
class LineItem(models.Model):
date = models.DateField(null=True, blank=False)
# journal_entry = models.ForeignKey(JournalEntry, on_delete=models.PROTECT)
# this journal_entry fk wouldn't work so you'd have to replace it with something else
ledger = models.ForeignKey(Ledger, on_delete=models.PROTECT)
description = models.CharField(max_length=255, null=True, blank=True)
cr = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
dr = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
然后对于视图,我将编写如下内容:
views.py
from .models import LineItem
def journalentries_show_all(request):
context = LineItem.objects.filter(arbitrary_criteria = True) # choose your own criteria here
return render(request, 'journal/journalentries_show_all.html', context)
重要的部分是选择过滤器。如果要按日期进行前两个操作,可以遵循示例here。
答案 2 :(得分:0)
也许我理解您错了,但是为什么不将JournalEntry querset发送到模板呢?
def journalentries_show_all(request):
context['journal_entries'] = JournalEntry.objects.all()
....
然后您可以在模板中显示所需内容
{% for entry in journal_entries %}
{{ entry.id }} {{ entry.date }}
{% for item in entry.lineitem_set.all|slice:"2" %}
{{ item.ledger.name }}
{% endfor %}
{% endfor %}
答案 3 :(得分:0)
经过一番挖掘,我发现可以直接在模板中访问相关变量,如下所示:
<td>{{ journal_entry.date }}</td>
<td>{{ journal_entry.lineitem_set.all.1.ledger }}</td>
<td>{{ journal_entry.lineitem_set.all.0.ledger }}</td>
<td>{{ journal_entry.lineitem_set.all.1.description|truncatechars:15 }}</td>
<td>{{ journal_entry.lineitem_set.all.0.description|truncatechars:15 }}</td>