Django和Bokeh:如何将图形添加到“类详细信息视图”?

时间:2019-10-17 13:26:04

标签: django django-templates django-views data-visualization bokeh

我似乎无法弄清楚如何将图形添加到“类详细信息视图”中?不可能吗?我将其添加到detailView中,并在模板中使用以下命令进行调用:

 {{ div | safe }}

但是它不显示吗?我已经使它分别在视图和模板中可以正常工作。

这是我要实现的整个detailview。

DetailView

class MedarbejderDetailView(FormMixin, DetailView):
template_name = 'evalsys/medarbejder/detail.html'
model = Medarbejder
form_class = OpretEvalForm

def evalgraph(self):
    colors = ["#40e862", "#ff9d26", "#ff1424"]
    over = 0
    møder = 0
    under = 0
    none = 0
    counts = []
    items = ["Overstiger forventning", "Møder forventning", "Under forventning", "Ingen bedømmelse"]
    eval_vudering = Evaluering.objects.values("vuderingsnavn__vuderingsnavn")
    source = ColumnDataSource(data=dict(items=items, counts=counts))

    for i in eval_vudering:
        if "Overstiger forventning" in i.values():
            over += 1
        elif "Møder forventning" in i.values():
            møder += 1
        elif "Under forventning" in i.values():
            under += 1
        elif None in i.values():
            none += 1
    counts.extend([over, møder, under, none])

    plot = figure(x_range=items, plot_height=500, plot_width=500, title="Opsumering af evalueringer",
                  toolbar_location=None, tools="pan, wheel_zoom, box_zoom, reset, tap", tooltips="@items: @counts")
    plot.title.text_font_size = "20pt"
    plot.vbar(x="items", top="counts", width=0.9, source=source, legend="items", line_color='black',
              fill_color=factor_cmap("items", palette=colors, factors=items))
    plot.legend.label_text_font_size = "13pt"
    script, div = components(plot)
    return render(self, 'evalsys/medarbejder/detail.html', {'script': script, 'div': div})

def view_medarbejder_with_pk(self, pk=None):
    if pk:
        medarbejder = Medarbejder.objects.get(pk=pk)
    else:
        medarbejder = self.medarbejder
    args = {'medarbejder': medarbejder}
    return render(self, 'evalsys/medarbejder/detail.html', args)

def get_context_data(self, **kwargs):
    context = super(MedarbejderDetailView, self).get_context_data(**kwargs)
    context['eval_list'] = Evaluering.objects.all()
    context['fag_list'] = Fag.objects.all()
    context['ma'] = Medarbejder.objects.get(pk=self.kwargs.get('pk'))
    context['instruktør'] = User.objects.get(username=self.request.user)
    return context

def post(self, request, pk):
    self.object = self.get_object()
    form = self.get_form()
    if form.is_valid():
        print(form.cleaned_data)
        instance = form.save(commit=False)
        instance.instruktør = request.user
        instance.ma = self.object
        return self.form_valid(form)
    else:
        return self.form_invalid(form)

def form_valid(self, form):
    item = form.save()
    self.pk = item.pk
    return super(MedarbejderDetailView, self).form_valid(form)

def form_invalid(self, form):
    return super(MedarbejderDetailView, self).form_invalid(form)

def get_success_url(self):
    return reverse_lazy("evalsys:view_evaluering_with_pk", kwargs={'pk': self.pk})

URL

path('se_alle_evalueringer/<int:pk>', views.MedarbejderEvalDetailView.as_view(), name="view_evaluering_with_fag"),

我知道我正在调用函数“ view_evaluering_with_fag”,这是因为我没有在调用Bokeh函数“ evalgraph”吗?

1 个答案:

答案 0 :(得分:0)

当我们研究同一个问题时,人们不知道人们不能以此为跟进问题。

无论如何,我很高兴成为您的一天!经过大量的反复试验(我在1999年只使用Python和Django进行编码一个月,除了Java以外,没有任何实际的编码背景),我可以从detailview渲染bokeh。看来,诀窍是在get_context_data函数下获取内容。我不知道如何得出这个结论,但是我认为脚本和div上下文没有进入渲染,因此我试图将它们纳入上下文。如您在下面看到的,我将script和div分别作为context ['script'] = script和context ['div'] = div。我的情况看起来更简单一些,我只是解析一个自行车数据文件并绘制数据,但是希望如果您仍在尝试使之工作,那么这将使您步入正轨。

class FitFileDetailView(DetailView):
    model = FitFiles

    def get_context_data(self, **kwargs):
        model = FitFiles
        ff = FitFiles.objects.get(pk=self.kwargs.get('pk'))

        ffile = ff.fitfiles.path
        fitfile2 = FitFile(ffile)
        while True:
            try:
                fitfile2.messages
                break
            except KeyError:
                continue

        workout2 = []
        for record in fitfile2.get_messages('record'):
            r2 = {}
    # Go through all the data entries in this record
            for record_data in record:
                r2[record_data.name] = record_data.value

            workout2.append(r2)

        df2 = pd.DataFrame(workout2)
        df2['time']=(df2['timestamp'] - df2['timestamp'].iloc[0]).astype('timedelta64[s]')

    #Bokeh code

        df2 = pd.DataFrame(workout2)
        df2['time']=(df2['timestamp'] - df2['timestamp'].iloc[0]).astype('timedelta64[s]')
        p2 = figure(x_axis_label='time', y_axis_label='watts', tools="", plot_width=1000, plot_height=500)
        p2.line(df2['time'], df2['power'])
        p2.line(df2['time'], df2['heart_rate'], color='red')
        script, div = components(p2)
        context = super(FitFileDetailView, self).get_context_data(**kwargs)
        context['script']=script
        context['div']=div
        return context