【问题标题】:Query two models in Class Based View在基于类的视图中查询两个模型
【发布时间】:2017-08-13 07:54:00
【问题描述】:

我试图在我的IndexView 中运行两个以上的查询,并在我的模板中显示结果。但是,我似乎无法将 Entry.objects.filter(date=today_date)Savings.objects.filter(id=1) 添加到 get_context_data 而不出错:

使用参数 '('',)' 和关键字反转 'entry-update' 未找到参数“{}”。尝试了 1 种模式: ['tracker/entry/update/(?P[0-9]+)/$']

如何将来自两个不同模型的数据提取到一个视图中?更具体地说,我将如何让这样的事情起作用:

def get_context_data(self, **kwargs):
    et = super(IndexView, self).get_context_data(**kwargs)
    et['filter'] = Entry.objects.filter(date=today_date), (Savings.objects.filter(id=1))
    return et

提前感谢您的帮助!

views.py

class IndexView(generic.ListView):
    template_name = 'argent/index.html'
    context_object_name = 'object_list'

    def get_queryset(self):
        return Entry.objects.all()

    def get_context_data(self, **kwargs):
        et = super(IndexView, self).get_context_data(**kwargs)
        et['filter'] = Entry.objects.filter(date=today_date)

        return et

models.py

class Entry(models.Model):
    date = models.DateField(blank=True, null=True,)
    euros = models.CharField(max_length=500, blank=True, null=True)
    comments = models.CharField(max_length=900, blank=True, null=True)
    euros_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    xrate = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    dollars_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    daily_savings_dollars = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    daily_savings = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)

    def get_absolute_url(self):
        return reverse('argent:detail', kwargs={'pk': self.pk})

    def item_date(self):
        row_title = self.date
        return row_title


class Savings(models.Model):
    total_spent_euros = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    total_spent_dollars = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    total_savings = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)

    def get_absolute_url(self):
        return reverse('argent:detail', kwargs={'pk': self.pk})

编辑:我在这篇文章中添加了更多细节。

【问题讨论】:

  • 你得到什么错误?因为这是好方法。您在上下文中添加新的查询集结果。在 object_list 你有 get_queryset() 方法的结果。
  • 错误大多表明get_querysetget_context_data已经定义,因此不能再次使用,这是有道理的。但是我不知道如何在一个 get_querysetget_context_data 函数中加入多个查询。我要做的是从Entry.objects.filter(date=today_date)Savings.objects.filter(id=1) 中提取数据,然后在模板中显示这两个结果。

标签: django python-3.x django-views django-queryset


【解决方案1】:

关于您在一页中获取两个查询集结果的问题:

def get_context_data(self, **kwargs):
    et = super(IndexView, self).get_context_data(**kwargs)
    et['entry_qs'] = Entry.objects.filter(date=today_date)
    et['savings_qs'] = Savings.objects.filter(id=1)
    return et

现在在您的模板中,您可以访问这两个查询集。 {{ entry_qs }}{{ savings_qs }}

关于你的错误

使用参数 '('',)' 和关键字反转 'entry-update' 未找到参数“{}”。尝试了 1 种模式: ['tracker/entry/update/(?P[0-9]+)/$']

我想你在你的模板中写了一个错误的模板url。您使用 url entry-update 没有参数。所以 Django 不能反转这个 url。因为这不存在。您需要将参数传递给此 url

{% url 'entry-update' pk %}  # replace pk by primary key of the correct object

【讨论】:

  • 行得通!现在我看到它完全有道理。谢谢!
  • 很高兴为您提供帮助
猜你喜欢
  • 2012-10-09
  • 2021-08-31
  • 2017-10-18
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多