我正在尝试为登录我的网站的用户创建一个分析仪表板页面。因此,如果用户'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='DummyCo')
替换为(client=self.get('username')
的内容,但我还无法破解。或者,也许我的URL不知道其实际显示在我的网站上的页面是什么,我需要对该URL进行第二次查看吗?
答案 0 :(得分:0)
您需要在URL中提供客户端:
url(r'^api/chart/data/<str:client>$', ChartData.as_view()),
然后将其作为参数放在get
中
def get(self, request, client):
我不确定您为什么没有format = None。它与您的urls.py
此外,我建议不要将Django REST框架的APIView
用于非API视图(例如,您正在渲染页面,而不提供REST API端点)。
为此,只需使用普通的Django class based views.