HTMLCalendar в приложении Django: недостающие аргументы - PullRequest
7 голосов
/ 01 июля 2019

Я пытаюсь воспроизвести эту ссылку в моем приложении Django

Views.py

from calendar import HTMLCalendar
from datetime import date
from itertools import groupby
from django.utils.html import conditional_escape as esc
from django.shortcuts import render_to_response
from django.utils.safestring import mark_safe

class WorkoutCalendar(HTMLCalendar):

    def __init__(self, workouts):
        super(WorkoutCalendar, self).__init__()
        self.workouts = self.group_by_day(workouts)

    def formatday(self, day, weekday):
        if day != 0:
            cssclass = self.cssclasses[weekday]
            if date.today() == date(self.year, self.month, day):
                cssclass += ' today'
            if day in self.workouts:
                cssclass += ' filled'
                body = ['<ul>']
                for workout in self.workouts[day]:
                    body.append('<li>')
                    body.append('<a href="%s">' % workout.get_absolute_url())
                    body.append(esc(workout.title))
                    body.append('</a></li>')
                body.append('</ul>')
                return self.day_cell(cssclass, '%d %s' % (day, ''.join(body)))
            return self.day_cell(cssclass, day)
        return self.day_cell('noday', '&nbsp;')

    def formatmonth(self, year, month):
        self.year, self.month = year, month
        return super(WorkoutCalendar, self).formatmonth(year, month)

    def group_by_day(self, workouts):
        field = lambda workout: workout.performed_at.day
        return dict(
            [(day, list(items)) for day, items in groupby(workouts, field)]
        )

    def day_cell(self, cssclass, body):
        return '<td class="%s">%s</td>' % (cssclass, body)

def calendar(request, year, month):


  my_workouts = Quiz.objects.orderby('scheduled_date').filter(owner_id=request.user.pk, scheduled_date__year=year, scheduled_date__month=month).annotate(c=Sum('weight')).values('c')

  print("my_workouts", my_workouts)

  cal = WorkoutCalendar(my_workouts).formatmonth(year, month)
  return render_to_response('classroom/teachers/graph_tot_trucks.html', {'calendar': mark_safe(cal),})

Urls.py

path('abc/', teachers.calendar, name='cal'),

foo.html

<head>

    {{calendar}}

</head>

Когда я запускаю это, это приводит к

calendar () отсутствует 2 обязательных позиционных аргумента: 'year' и 'month'

Что я делаю иначе, чем код, указанный в ссылке?

Traceback

Traceback:

Файл "C: \ Users \ Sid \ Anaconda3 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ обработчики \ exception.py" во внутреннем 35. response = get_response (запрос)

Файл "C: \ Users \ Sid \ Anaconda3 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ обработчики \ base.py" в _get_response 128. response = self.process_exception_by_middleware (e, запрос)

Файл "C: \ Users \ Sid \ Anaconda3 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ обработчики \ base.py" в _get_response 126. response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)

Тип исключения: ошибка типа в / shipper / abc / Значение исключения: календарь () отсутствует 2 обязательных позиционных аргумента: 'год' и 'месяц'

1 Ответ

1 голос
/ 01 июля 2019

Вы должны добавить year и months в качестве параметров в urls.py

path('abc/<int:year>/<int:month>/', name='cal'),

Если вы хотите создать календарь на каждый год и месяц, вам придется циклически проходить каждый год и каждый месяц

years = set([quiz.scheduled_date.year for quiz in Quiz.objects.all()])
months = set([quiz.scheduled_date.month for quiz in Quiz.objects.all()])

quizzes = []

for year in years:

    for month in months:

        quiz = Quiz.objects.orderby('scheduled_date').filter(owner_id=request.user.pk, scheduled_date__year=year, scheduled_date__month=month).annotate(c=Sum('weight')).values('c')
        quizzes.append(quiz)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...