Джанго и Боке: Как мне добавить свой график в представление сведений о классе? - PullRequest
0 голосов
/ 17 октября 2019

Не могу понять, как добавить свой график в представление сведений о классе? Разве это невозможно сделать? Я добавляю его в detailView и вызываю в своем шаблоне с помощью:

 {{ div | safe }}

Но это не отображается? Я сделал так, чтобы он отлично работал в представлении и шаблоне отдельно.

Вот весь подробный вид, в который я пытаюсь реализовать его.

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"?

...