【问题标题】:Creating Django Query Sets to Access Entire Database创建 Django 查询集以访问整个数据库
【发布时间】:2015-10-08 21:29:25
【问题描述】:

更新我意识到我下面的解释有点隐藏我真正的问题是什么。最终,我想要完成的是创建一个dashboard.html 模板,并能够从我的流量和电子邮件模型中呈现访问/数据。

我正在使用 Django 1.8.3 和 Python 3.4.3

我正在构建一个软件,它将接受输入的值并将它们显示在视图中 - 很简单。目前我有两个带有单独模板的模型/视图来查看数据。这按预期工作。

我还在创建一个仪表板,该仪表板应该从我的两个模型中提取数据,这是让我悲伤的部分,试图将我的思绪包裹起来。我阅读了很多关于查询集的内容,但找不到我完全理解的如何在我的项目中实施的示例。

让您了解渲染的内容;此数据是从 Google Analytics 导出的表格数据,转换为 csv,然后从 Django admin 导入应用程序。这个想法是能够使用“for”循环将数据作为列表查看,这很有效,仪表板能够制作计算数据的可视化图表。

任何帮助将不胜感激。我不确定你需要多少信息,所以我会尽可能多地包括在下面。谢谢。

models.py

from django.db import models


class Traffic(models.Model):
    date = models.DateField()
    traffic = models.PositiveIntegerField(null=True)
    ifs_signups = models.IntegerField(null=True)
    campaigns = models.IntegerField(null=True)
    sales = models.PositiveIntegerField(null=True)

    def month(self):
        return self.date.strftime("%B")

    def quarter(self):
        item = self.date.strftime("%B")
        q1 = (["January", "February", "March"])
        q2 = (["April", "May", "June"])
        q3 = (["July", "August", "September"])
        q4 = (["October", "November", "December"])

        if item in q1:
            return "1st Quarter"
        elif item in q2:
            return "2nd Quarter"
        elif item in q3:
            return "3rd Quarter"
        elif item in q4:
            return "4th Quarter"
        else:
            return "No Date Specified"

    def conversions(self):
        conversion = self.sales / self.traffic
        return "%r" % conversion


class Email(models.Model):
    date = models.DateField()
    subject = models.CharField(max_length=255)
    day_of_week = models.CharField(max_length=255)
    subject_type = models.CharField(max_length=255)
    content_type = models.CharField(max_length=255)
    email_list = models.CharField(max_length=255)
    recipients = models.PositiveIntegerField(null=True)
    unsubscribes = models.PositiveIntegerField(null=True)
    bounces = models.PositiveIntegerField(null=True)
    open = models.PositiveIntegerField(null=True)
    clicks = models.PositiveIntegerField(null=True)

    def month(self):
        return self.date.strftime("%B")

    def open_rate(self):
        open_rate = self.open / self.recipients
        return "%r" % open_rate

    def click_through_rate(self):
        click_through_rate = self.clicks / self.open
        return "%r" % click_through_rate

views.py

from django.shortcuts import render, redirect
from django.views.generic import ListView
from .models import Traffic
from .models import Email


class TrafficListView(ListView):
    model = Traffic
    template_name = 'dashboard/pages/traffic.html'

    def get_context_data(self, **kwargs):
        context = super(TrafficListView, self).get_context_data(**kwargs)
        return context


class EmailListView(ListView):
    model = Email
    template_name = 'dashboard/pages/email.html'

    def get_context_data(self, **kwargs):
        context = super(EmailListView, self).get_context_data(**kwargs)
        return context

【问题讨论】:

  • 我不知道你的问题是什么。你到底是哪里出了问题?
  • 抱歉,我的问题是如何创建视图,以便我的 dashboard.html 模板可以使用来自我的流量和电子邮件模型的数据。

标签: django python-3.x django-models django-templates django-views


【解决方案1】:

我建议脱离 ListView 并实现自己的简单 TemplateView

from myapp.models import Traffic, Email

class DashboardView(TemplateView):

    template_name = "dashboard/pages/dashboard.html"

    def get_context_data(self, **kwargs):
        context = super(DashboardView, self).get_context_data(**kwargs)
        context['email_list'] = Email.objects.all()
        context['traffic_list'] = Traffic.objects.all()
        return context

【讨论】:

  • 感谢您的回答,这是我一直在阅读的内容,但您的回答证实了这一点。您能否给我一个示例,说明我将如何引用dashboard.html 中的模板标签来呈现来自比如说交通的列表?在我的流量模板中,我使用 {% for traffic in object_list %}{% endfor %},但这在我的仪表板模板中不起作用。感谢您的帮助。
  • 当然,上下文对象可以作为模板中的变量名使用。所以:{% for traffic in traffic_list %}{% endfor %}
  • 太棒了!!非常感谢!!
猜你喜欢
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多