Python 如何在Django中向视图传递大量参数?

Python 如何在Django中向视图传递大量参数?,python,django,parameters,charts,Python,Django,Parameters,Charts,我对Django非常陌生,我正在尝试构建一个应用程序,以表和图表的形式展示我的数据。到目前为止,我的学习过程非常顺利,但现在我有点卡住了 My pageview从数据库检索大量数据并将其放入上下文中。然后,模板生成不同的html表。到目前为止还不错。 现在我想向模板添加不同的图表。我通过定义标记来实现这一点。Matplotlib图表在我的图表视图中生成,并通过以下方式返回: response=HttpResponse(content_type='image/png') canvas.print_

我对Django非常陌生,我正在尝试构建一个应用程序,以表和图表的形式展示我的数据。到目前为止,我的学习过程非常顺利,但现在我有点卡住了

My pageview从数据库检索大量数据并将其放入上下文中。然后,模板生成不同的html表。到目前为止还不错。
现在我想向模板添加不同的图表。我通过定义
标记来实现这一点。
Matplotlib图表在我的图表视图中生成,并通过以下方式返回:

response=HttpResponse(content_type='image/png')
canvas.print_png(response)
return response
现在我有不同的问题:

  • 数据从数据库中检索两次。一次在页面视图中呈现表格,另一次在图表视图中制作图表。将已经在页面上下文中的数据传递到图表视图的最佳方式是什么
  • 我需要很多图表,每个都有不同的数据集。我可以为每个图表创建一个图表视图,但可能有更好的方法。如何将不同的数据集名称传递给图表视图?有些图表有20个数据集,因此我认为通过url(如:
    )传递这些数据集参数不是正确的方法。
    有什么建议吗

  • 无法将数据从页面视图传递到图表视图,因为它们是单独的HTTP请求。您有几个选择:

  • 传递图表URL中的所有数据。这听起来可能很疯狂,但这正是谷歌图表所做的:

  • 将数据存储在会话中。页面视图将在会话中填充数据,图表视图将使用它创建图表

  • 将数据库查询缓存在memcache中。由于页面和图表都将引用同一个查询,因此很可能会命中缓存。这是一个很好的解决方案,因为即使没有先呈现页面,图表仍然可以工作

  • 只需再次查询数据库。您的DBMS可能具有良好的缓存,性能可能不是您想象的问题


  • 对于你的第二个问题,一个URL中的20个单词似乎没什么大不了的。当然,您可能会找到所选数据集的一些模式,这样您就不必每次都指定它们,但如果需要,只需创建长URL。

    使用模板标记可能是我在这里采用的方法。我也遇到过类似的情况,日历信息在同一页面上以不同的格式呈现了多次。我处理它的方式是将查询的数据传递到请求上下文中,然后简单地将该queryset用作模板标记的参数。结果是,您可以使用如下模板语法:

    查看

    def my_view(request, *args, **kwargs):
        yearly_sales_qs = SaleRecord.objects.filter(param=value)
        monthly_sales_qs = SalesRecord.objects.filter(param=foo)
    
        return render_to_response( ..., locals(), ... )
    
    模板

    {% load data_tags %}
    
    <div class="year">
        {% render_data_table for yearly_sales_qs %}
        {% render_bar_chart for yearly_sales_qs %}
    </div>
    
    <div class="month">
        {% render_data_table for monthly_sales_qs %}
        {% render_bar_chart for monthly_sales_qs %}
    </div>
    
    然后我们可以制作单独的标签来处理我们需要的任何东西

    @register.tag
    def render_bar_chart(parser, token):
        return DataForTag.handle_token(parser, token, 'data/charts/barchart.html')
    
    @register.tag
    def render_pie_chart(parser, token):
        return DataForTag.handle_token(parser, token, 'data/charts/piechart.html')    
    
    @register.tag
    def render_data_table(parser, token):
        return DataForTag.handle_token(parser, token, 'data/table.html')   
    

    谢谢你的回答,内德。Nr 1:那会奏效,但我的直觉告诉我应该有一个更“受人尊敬”的解决方案。Nr2:这就是我想要的。这解决了我遇到的问题,谢谢T·斯通。这可能解决了我的问题。我需要先测试一下才能确定。不管怎样,你的回答让我学到了很多关于标签的知识,如果不是现在,那么在将来,这些都会很有用。
    @register.tag
    def render_bar_chart(parser, token):
        return DataForTag.handle_token(parser, token, 'data/charts/barchart.html')
    
    @register.tag
    def render_pie_chart(parser, token):
        return DataForTag.handle_token(parser, token, 'data/charts/piechart.html')    
    
    @register.tag
    def render_data_table(parser, token):
        return DataForTag.handle_token(parser, token, 'data/table.html')