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

Python 将请求(用户)传递到基于类的视图,python,django,django-views,django-class-based-views,Python,Django,Django Views,Django Class Based Views,作为一个对基于类的视图有点陌生的人,我决定用它们来驱动我正在开发的应用程序中的一些图表 然而,我想让这张图表充满活力,并希望它根据看到它的人而改变 如何将请求(从中获取用户)传递到基于类的视图 下面是我的非工作实现(使用虚拟数据但未传递任何请求): 查看: class LineChartJSONView(BaseLineChartView, request): user = request.user def get_labels(self): labels =

作为一个对基于类的视图有点陌生的人,我决定用它们来驱动我正在开发的应用程序中的一些图表

然而,我想让这张图表充满活力,并希望它根据看到它的人而改变

如何将请求(从中获取用户)传递到基于类的视图

下面是我的非工作实现(使用虚拟数据但未传递任何请求):

查看:

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()
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>
def ViewBaseChart(request):

    context = {}
    template = "dashboard/test_chart.html"

    return render(request,template,context) 
网址:

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()
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>
def ViewBaseChart(request):

    context = {}
    template = "dashboard/test_chart.html"

    return render(request,template,context) 
HTML:

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()
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>
def ViewBaseChart(request):

    context = {}
    template = "dashboard/test_chart.html"

    return render(request,template,context) 

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

您的类定义不正确。CBV不应该从HttpRequest继承(我甚至不确定这是否就是您所说的
请求
) . 正确的定义是

class LineChartJSONView(BaseLineChartView):
当然,这假定
BaseLineChartView
已正确定义。下面的一行也应该删除,因为它定义了一个全局用户,其次是因为那里没有请求对象

user = request.user
现在,要获得用户实例,需要重写get、post方法

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

您不需要将
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的基于类的通用视图。它们充满了随时可用的功能。这里是指向类方法内部doc

的链接,您可以使用
self.request
yes访问请求。您可能希望覆盖get、post、put方法(或get\u对象方法)。这里有一个很好的资源: