创建一个包含相关对象的值的字符串以在视图中显示

时间:2019-12-23 09:37:05

标签: django

我是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,但这些是在另一个视图中处理的。

4 个答案:

答案 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模型只有一个字段?我们可以将JournalEntryLineItem组合成这样的东西吗?

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>