2016-10-16 16 views
0

クラスベースのビューを少し新しくした人として、私はそれらを使って、私が取り組んでいるアプリケーションでいくつかのチャートを動かすことにしました。リクエスト(ユーザー)をクラスベースのビューに渡す

しかし、私はこのチャートを動的にしたいと思っており、誰がそれを見ているかに基づいて変更したいと思います。

リクエストを(ユーザーを取得するために)クラスベースのビューに渡すにはどうすればよいですか?

以下

は(ダミーデータでの作業が、何の要求が渡されていないされている)私の非稼働実装です:

ビュー:

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:

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

HTML:

{% 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> 

ビュー(上記の静的ため - 非classbasedview):

def ViewBaseChart(request): 

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

    return render(request,template,context) 

私は正しくここに、クラスベースのビューの概念を使用していますわからないが、しかし、これはへの唯一の道であることがわかってきましたこれまでのチャートを実装する。

+2

クラスメソッドの中で、 'self.request'で要求にアクセスできます –

+0

はい。 get、post、putメソッド(またはget_objectメソッド)をオーバーライドする必要があります。ここの良いリソース:https://docs.djangoproject.com/ja/1.10/topics/class-based-views/intro/ – Corgs

答えて

2

あなたはDjangoの汎用ビューからそれらを継承する場合、それはあなたのためにそこに既にある、クラスベースのビューにrequestを渡す必要はありません。一般的なクラスベースのビューには、リクエスト(GET、POSTなど)を処理するメソッドがあります。例えば

:Djangoのジェネリッククラスベースのビューについて

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""" 

読みます。彼らはすぐに使える機能がいっぱいです。ここにdocへのリンクがありますDjango class based views introduction

1

クラス定義が正しくありません。 CBVはHttpRequestから継承するべきではありません(そして、あなたが意味するものなら、それはrequestであると確信していません) 。正しい定義は、これはBaseLineChartViewが正しく定義されていることを当然の前提としてい

class LineChartJSONView(BaseLineChartView): 

です。次の行は、グローバルユーザーを定義しているため、またそこに要求オブジェクトがないために削除する必要があります。

user = request.user 

ユーザーインスタンスを取得するには、get、postメソッドをオーバーライドする必要があります。

def get(self, request): 
    user = request.user 
関連する問題