首页 > 解决方案 > 在 ListView 中使用两个模型

问题描述

我的交易列表中的每个预算类别都有一个 ListView。对于这些视图中的每一个,我想显示此类别的实际预算。例如,我的账单预算包含租金、保险、电话等子预算,这些子预算存储在与交易不同的模型中。当前的 ListView 只是发送按预算类型过滤的交易:

class BillListView(ListView):
    model = Transaction
    template_name = 'budget/base_transactions.html'
    context_object_name = 'transactions'
    paginate_by = 10
    queryset = Transaction.objects.filter(budget_type__exact='bill')

有没有办法从我的预算数据库中发送子预算数据,以便我可以在模板顶部显示它?

我的模型:

class Transaction(models.Model):
    date = models.DateField(default=datetime.date.today)
    description = models.CharField(max_length=100, default="")
    category = models.CharField(max_length=100, default="")
    amount = models.DecimalField(max_digits=10, decimal_places=2, default=0.0)
    budget_type = models.CharField(max_length=100, default="")

    def __str__(self):
        return self.description + ' ' + str(self.amount)

class Budget(models.Model):
    category = models.CharField(max_length=100, default="")
    sub_category = models.CharField(max_length=100, default="")
    amount = models.DecimalField(max_digits=10, decimal_places=2, default=0.0)

标签: djangopython-3.xdjango-views

解决方案


如果您想通过 传递另一个模型的数据ListView,您可能正在寻找覆盖 的get_context_data方法ListView。然后,您可以将所需的数据与我们的模型对象一起传递。

例如:

在您想要显示有关预算对象的数据的上下文中,您可以将BillListView视图更改为:

class BillListView(ListView):
    model = Transaction
    template_name = 'budget/base_transactions.html'
    context_object_name = 'transactions'
    paginate_by = 10
    queryset = Transaction.objects.filter(budget_type__exact='bill')

    def get_context_data(self, **kwargs):
        context = super(BillListView, self).get_context_data(**kwargs)
        context['budgets'] = Budget.objects.filter(category__exact='bill') //filter as per required
        return context

然后,您可以budget通过以下方式循环访问模板中的对象budgets

{% for budget in budgets %}
    {{ budget.amount }}
    {{ budget.sub_category }}
{% endfor %}

推荐阅读