2016-10-16 1 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> 

View (для статического выше - не 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/en/1.10/topics/class-based-views/intro/ – Corgs

ответ

2

Вам не нужно проходить request взглядам на основе класса, это уже есть для вас, если вы унаследовали их от общих взглядов Джанго. Представления на основе общего класса имеют методы обработки запросов (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 class based views introduction

1

Неверное определение вашего класса. CBV не должен наследовать от HttpRequest (и я даже не уверен, что это то, что вы подразумеваете под request) . Правильное определение

class LineChartJSONView(BaseLineChartView): 

Это предполагает, конечно, что BaseLineChartView был определен правильно. Следующая строка также должна быть удалена, так как она определяет глобального пользователя, а во-вторых, потому что там нет объекта запроса!

user = request.user 

Теперь, чтобы получить экземпляр пользователя, вам необходимо переопределить методы get, post.

def get(self, request): 
    user = request.user 
Смежные вопросы