【发布时间】:2020-08-20 19:16:39
【问题描述】:
我正在尝试为登录我网站的用户创建一个分析仪表板页面。因此,如果用户“DummyCo”登录并转到mywebsite.com/DummyCo/dashbord,他们将看到与他们被列为用户的模型记录相关的分析(或client,因为我在模型上称它们为。)我的数据正在工作(如下所示)但这只是让我显示计数。
我想做的是开始在我已经启动并运行的 chart.js 上的图表中使用这些数据,但它不允许我像其他视图那样抓取该登录用户(图表视图如下所示)。
models.py
class Session(models.Model):
uid = models.CharField(max_length=50, blank=True)
cid = models.CharField(max_length=50, blank=True)
client = models.CharField(max_length=50, blank=True)
views.py
class DashboardListView(LoginRequiredMixin, ListView):
template_name = 'blog/dashboard.html'
context_object_name = 'sessions'
ordering = ['-session_date']
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Session.objects.filter(client=user).order_by('-session_date')
def get_context_data(self, **kwargs):
user = get_object_or_404(User, username=self.kwargs.get('username'))
context = super().get_context_data(**kwargs)
session_list = list(context['sessions'])
context['total_actions'] = Session.objects.filter(client=user).count() # count function
context['total_users'] = Session.objects.filter(client=user).values('uid').distinct().count()
context['total_modules'] = Session.objects.filter(client=user).values('cid').distinct().count()
context['sessions'] = session_list
return context
@ login_required()
def dashboard(request):
return render(request, 'blog/dashboard.html', {'title': 'Dashboard'})
urls.py
path('<str:username>/dashboard/', views.dashboard and DashboardListView.as_view(), name='blog-dashboard')
生成的html标签
{{ total_users }}, {{ total_actions }}, {{ total_modules }}
现在这里是我设置 chart.js 的方式:
views.py
class ChartData(APIView):
authentication_classes = []
permission_classes = []
def get(self, request, format=None):
session = Session.objects.filter(client='DummyCo').count()
labels = ['Sessions', 'Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange']
default_items = [session, 12, 15, 15, 22, 23, 20]
data = {
"labels": labels,
"default": default_items,
}
return Response(data)
urls.py
url(r'^api/chart/data/$', ChartData.as_view()),
带有 ajax 和所有 chart.js 内容的 html 代码
{% block jquery %}
var endpoint = '/api/chart/data/'
var defaultData = []
var labels = [];
$.ajax({
method: "GET",
url: endpoint,
success: function(data){
labels = data.labels
defaultData = data.default
setChart()
},
error: function(error_data){
console.log("error")
console.log(error_data)
}
})
function setChart(){
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: '# of Votes',
data: defaultData,
backgroundColor:... (cutting off here for sanity)
但是如何用 URL 的username 替换硬编码的“DummyCo”?这样,当一个用户退出并新用户登录时,他们只能看到自己的数据。
我在想有一种简单的方法可以用类似于(client=self.get('username') 的东西替换(client='DummyCo'),但我还没有破解它。或者我的 URL 不知道它实际显示在我网站上的哪个页面,我需要为 URL 引入第二个视图?
【问题讨论】:
标签: python django chart.js analytics