【问题标题】:Get data from the model class in Django从 Django 中的模型类中获取数据
【发布时间】:2017-08-07 06:28:19
【问题描述】:

我有一个特定频道的 DetailView。此处列出了该通道的所有数据。有一个名为“ExecutionLog”的模型类。目前,所有其他数据都显示在详细视图中,但来自“ExecutionLog”模型类的数据除外。

该课程在“基于课程的视图”中,这对我来说是全新的。我无法理解到底发生了什么。

DetailView 类视图:

class ChannelDetailView(LoginRequiredMixin, SuperAdminMixin, ChannelView, DetailView):
    def get_context_data(self, *args, **kwargs):
        context = super(ChannelDetailView, self).get_context_data(*args, **kwargs)

        if 'date' in self.request.GET:
            d = self.request.GET['date']
            date = datetime.datetime.strptime(d, "%Y-%m-%d").date()
        else:
            date = datetime.date.today()
        context['activePage'] = {'tree': 'ChannelPage', 'branch': 'index'}
        datas = get_datas_hourly(True, self.object.id, date)
        matches_data = get_datas_hourly(False,self.object.id, date)
        context['date'] = date
        context['labels'] = datas.keys()
        context['values'] = datas.values()
        context['matches_labels'] = matches_data.keys()
        context['matches_values'] = matches_data.values()
        return context

ExecutionLog 模型:

class ExecutionLog(models.Model):
    ACTION_TYPES = (
        (0, 'START'),
        (1, 'STOP'),
        (2, 'ASSIGNED'),
        (3, 'ERROR'),
        (4, 'OTHERS'),
    )
    type = models.IntegerField(default=0, choices=ACTION_TYPES)
    title = models.CharField(max_length=255)
    description = models.TextField(max_length=255, blank=True, null=True)
    date = models.DateTimeField(auto_now_add=True)
    execution = models.ForeignKey(Execution, related_name="execution_logs")

    class Meta:
        ordering = ['-date']

我想获取detailview页面所在频道的ExecutionLog数据。

【问题讨论】:

  • 那么,您的实际问题是什么?你遇到了什么错误?
  • 我不明白如何从模型类中获取数据并通过“ChannelDetailView”类发送。
  • 感谢@BearBrown,文档很有帮助。终于知道到底是怎么回事了。但我仍然不明白的是如何将'ExecutionLog'中的值获取到视图类
  • 是需要创建ExecutionLogView还是需要将ExecutionLog添加到ChannelDetailView

标签: python django


【解决方案1】:

您可能需要覆盖您的 get() 方法,

def get(self, request, *args, **kwargs):
    self.object = self.get_object()
    context = self.get_context_data(object=self.object)
    return self.render_to_response(context)

您可以根据需要编辑视图。另外,先看看DetailView的定义。

编辑

def get_context_data(self, *args, **kwargs):
    context = super(ChannelDetailView, self).get_context_data(*args, **kwargs)

    if 'date' in self.request.GET:
        d = self.request.GET['date']
        date = datetime.datetime.strptime(d, "%Y-%m-%d").date()
    else:
        date = datetime.date.today()
    context['activePage'] = {'tree': 'ChannelPage', 'branch': 'index'}
    datas = get_datas_hourly(True, self.object.id, date)
    matches_data = get_datas_hourly(False,self.object.id, date)
    context['date'] = date
    context['labels'] = datas.keys()
    context['values'] = datas.values()
    context['matches_labels'] = matches_data.keys()
    context['matches_values'] = matches_data.values()
    context['executionLogs'] = ExecutionLog.objects.all()
    #^^^^^^^^^^^ You can access the execution logs in your template.
    return context

您必须遍历查询集并在模板中一一访问属性,例如

{% for item in execution_log %} 
    {{ item.type }} 
    {{ item.title }}
    {{ item.description }}
    .....
{% endfor %}

【讨论】:

  • 我只想在视图类中获取'ExecutionLog'数据。我应该这样做吗。其他一切都很好
  • 你问题中的观点,是全部还是观点中还有什么??
  • 还有其他看法。但对于“ChannelDetailView”,这是唯一的
  • 我的意思是,在您刚刚发布的视图中,只有一种方法get_context_data()..您的代码中是否定义了其他方法?如果没有,你肯定需要添加一个get() 方法。
  • 不,get_context_data() 是唯一的一个。我不能只编写查询以在同一函数中获取 ExecutionLog 数据并返回值吗?
猜你喜欢
  • 2020-09-19
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2016-08-11
  • 2018-07-02
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多