新手:Django的:传递到模板之前添加计算结果查询集(Newbie: Django : Addin

2019-08-16 22:32发布

它我使用Django的新生活的第二天,请原谅我的问题的简单性。

我有我一直在使用的URL,视图模式和所有的好东西成功地显示在网页上的内容,现有的数据库表(只读访问)。

我所面临的挑战是表不包含我需要显示的所有信息。 该表包含列,sampletime,samplevalue,sampleresult测试结果。 我需要显示基于我从那些列计算出不同的数据。

我的最终目标是要显示使用该信息作为一个时间序列图flotr 。 现在编号很乐意只转储我需要一个表格的网页上的数据。(所以我们能想象得到的数据)

我还想什么传递给模板,

  • jssampletime(转换为JavaScript的划时代毫秒sampletime DateTime对象)
  • resultvalue( - 基于samplevalue的sampleresult是好还是坏的滚动总和+)

我很好使用高清功能resultvalue创建jssampletime和。 我相信我会添加这些功能的views.py

我想我需要做的遍历一个QuerySet在views.py,并将结果保存在我传递给模板字典的列表。 像这样的东西(代码未测试)。

views.py

# views.py
# Sudo code to assit in asking the question
from django.shortcuts import render_to_response
from thing.reporter.models import Samples

def _datetime_to_js(sampletime):
    #.. date conversion epoch magic
    return jsd_result

def _rolling_sum(samplevalue,sampleresult):
    #.. summing magic
    return sum_result

def dumptable(request): # The def that is called by urls.py
    object_list = Samples.objects.all()

    list_for_template = []
    for row in object_list:
        jssampletime = _datetime_to_js(row.sampletime)
        resultvalue  = _rolling_sum(row.samplevalue,row.sampleresult) 
        list_for_template.append({'jssampletime':jssampletime,'resultvalue':resultvalue})   

    return render_to_response('tabledump.html', {'result_list': list_for_template})

tabledump.html

# tabledump.html template
{% block content %}
    <h2>Results dumped to page for testing</h2>
    <ul>
    <table>
    {% for result in result_list %}
        <tr>
        <td>{{ result.jssampletime }}</td>
        <td>{{ result.resultvalue }}</td>
        </tr>
    {% endfor %}
    </table>
    </ul>
{% endblock %}

我认为这会工作,但林不知道,如果它是Django的MVC方式。

是不是我,

  • 计算结果通过了作用中一个QuerySet结果我在views.py需要什么?
  • 我的结果传递给一个模板字典的列表(是一个QuerySet不止于此)?

我猜林寻找一些方向和代码提示。 我在正确的道路上? 有没有更好的办法 ?

Answer 1:

如果要显示的信息是在一个模型中,为什么不只是添加属性/方法的模型,以显示你需要摆脱它的任何信息? 然后,你可以通过实际的型号列表/查询设为您的模板,并调用的方法作为属性。

class MyModel(models.Model):
    model_field = models.CharField(max_length=255)

    @property
    def calculated_field(self):
        return self._do_calculation(self.model_field)

如果你需要在你的循环进入状态变量,不要忘记,你可以在任何属性附加到Python对象。 这是非常有用的。 所以,在你看来,你可以有这样的:

for row in object_list:
    # update some variable we want to use in the template
    row.newly_added_field = run_calculation(row, somevariable)

这两种可能再在模板中进行访问:

{% for result in result_list %}
    <tr>
    <!-- some stuff that displays the model directly -->
    <td>{{ result.calculated_field}}</td>
    <td>{{ result.newly_added_field}}</td>
    </tr>
{% endfor %}


文章来源: Newbie: Django : Adding calculated results to Queryset before passing to template