将请求(用户)传递给基于 class 的视图
Passing request (user) to a class based view
作为对基于 class 的视图有点陌生的人,我决定使用它们来驱动我正在处理的应用程序中的一些图表。
但是,我想让这个图表动态化,并希望它根据看到它的人而改变。
如何将请求(从中获取用户)传递给基于 class 的视图?
下面是我的非工作实现(使用虚拟数据但没有传递请求):
查看:
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)
我不确定我在这里是否正确使用了基于 class 的视图概念,但是,我发现这是迄今为止实现图表的唯一方法。
您的 class 定义不正确。 CBV 不应该从 HttpRequest 继承(我什至不确定你所说的 request
是否就是这个意思)
.正确的定义是
class LineChartJSONView(BaseLineChartView):
这当然假定 BaseLineChartView
已被正确定义。还应删除以下行,因为它定义了一个全局用户,其次是因为那里没有请求对象!
user = request.user
现在要获取用户实例,您需要覆盖 get、post 方法。
def get(self, request):
user = request.user
您不需要将 request
传递给基于 class 的视图,如果您从 Django 的通用视图继承它们,它已经存在。基于 class 的通用视图具有处理请求(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 的通用视图。它们充满了随时可用的功能。这是文档 Django class based views introduction
的 link
作为对基于 class 的视图有点陌生的人,我决定使用它们来驱动我正在处理的应用程序中的一些图表。
但是,我想让这个图表动态化,并希望它根据看到它的人而改变。
如何将请求(从中获取用户)传递给基于 class 的视图?
下面是我的非工作实现(使用虚拟数据但没有传递请求):
查看:
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)
我不确定我在这里是否正确使用了基于 class 的视图概念,但是,我发现这是迄今为止实现图表的唯一方法。
您的 class 定义不正确。 CBV 不应该从 HttpRequest 继承(我什至不确定你所说的 request
是否就是这个意思)
.正确的定义是
class LineChartJSONView(BaseLineChartView):
这当然假定 BaseLineChartView
已被正确定义。还应删除以下行,因为它定义了一个全局用户,其次是因为那里没有请求对象!
user = request.user
现在要获取用户实例,您需要覆盖 get、post 方法。
def get(self, request):
user = request.user
您不需要将 request
传递给基于 class 的视图,如果您从 Django 的通用视图继承它们,它已经存在。基于 class 的通用视图具有处理请求(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 的通用视图。它们充满了随时可用的功能。这是文档 Django class based views introduction
的 link