将请求(用户)传递给基于类的视图

时间:2016-10-16 22:13:32

标签: python django django-views django-class-based-views

作为基于类视图的新手,我决定使用它们来驱动我正在处理的应用程序中的一些图表。

但是,我想让这个图表变得动态,并希望根据谁看到它来改变它。

如何将请求(以获取用户)传递给基于类的视图?

下面是我的非工作实现(处理虚拟数据但没有传递请求):

查看:

{% macro group_collection(collection, groupby) %}
{% set section = groupby|default(2) %}

    <ul>
    {% for element in collection %}
       {% if loop.index % section == 1  %}
         <li class="group">
       {% endif %}
       {% set th = TimberImage(element) %}
           <img src="{{th.src}}">
       {% if loop.index % section == 0 or loop.last %}
         </li>
      {% endif %}
    {% endfor %}
    </ul>

{% endmacro %}

URL:

class LineChartJSONView(BaseLineChartView, request):

    user = request.user

    def get_labels(self):
        labels = []
        items = Item.objects.filter(user = user)
        for i in items:
            labels.add(i.name)
        return labels

    def get_data(self):
        prices = []
        items = Item.objects.filter(user = user)
        for i in items:
            prices.add(i.price)
        return prices

line_chart = TemplateView.as_view(template_name='dashboard/test_chart.html')

line_chart_json = LineChartJSONView.as_view()

HTML:

url(r'^chart_data/$', LineChartJSONView.as_view(), name='line_chart_json'),  
url(r'^chart/$', views.ViewBaseChart, name='basic_chart'),

查看(针对上面的静态 - 非基于类的观点):

{% load staticfiles %}
<html>
    <head>
        <title>test chart</title>
    </head>
    <body>
        <canvas id = "myChart" width="500" height="200"></canvas>
        <!-- jQuery 2.2.3 -->
        <script src="{% static 'plugins/jQuery/jquery-2.2.3.min.js' %}"></script>
        <!-- Bootstrap 3.3.6 -->
        <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
        <!-- ChartJS 1.0.1 -->
        <script src="{% static 'plugins/chartjs/Chart.min.js' %}"></script>
        <!-- FastClick -->
        <script src="{% static 'plugins/fastclick/fastclick.js' %}"></script>
        <!-- AdminLTE App -->
        <script src="{% static 'dist/js/app.min.js' %}"></script>
        <!-- AdminLTE for demo purposes -->
        <script src="{% static 'dist/js/demo.js' %}"></script>
        <!-- page script -->
        <script type="text/javascript">
            $.get('{% url "line_chart_json" %}', function(data)
            {
                var ctx =
                $("#myChart").get(0).getContext("2d");
                new Chart(ctx).Line(data);
            });
        </script>
    </body>
</html>

我不确定我是否正确使用基于类的视图概念,但是,发现这是迄今为止实现图表的唯一方法。

2 个答案:

答案 0 :(得分:3)

您不需要将request传递给基于类的视图,如果您从Django的通用视图继承它们,它就已经存在了。基于通用类的视图具有处理请求的方法(GET,POST等)。

例如:

class LineChartJSONView(generic.View):
    def get(self, request, *args, **kwargs):
        """Handle GET request and return response"""

    def post(self, request, *args, **kwargs):
        """Handle POST request and return response"""

了解Django基于通用类的视图。它们充满了随时可用的功能。以下是文档Django class based views introduction

的链接

答案 1 :(得分:1)

您的班级定义不正确。 CBV不应该继承HttpRequest(我甚至不确定你的意思是request) 。正确的定义是

class LineChartJSONView(BaseLineChartView):

这当然假定BaseLineChartView已正确定义。还应删除以下行,因为它定义了一个全局用户,其次是因为那里没有请求对象!

user = request.user

现在要掌握用户实例,您需要覆盖get,post方法。

def get(self, request):
    user = request.user