Django 应用程序中的 HTMLCalendar:缺少参数

Posted

技术标签:

【中文标题】Django 应用程序中的 HTMLCalendar:缺少参数【英文标题】:HTMLCalendar in Django app: missing arguments 【发布时间】:2019-11-12 03:40:17 【问题描述】:

我正在尝试在我的 Django 应用中复制此 Link

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('clas-s-room/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'

我所做的与链接中提供的代码有何不同?

追溯

追溯:

文件 “C:\Users\Sid\Anaconda3\lib\site-packages\django\core\handlers\exception.py” 在内部 35. response = get_response(request)

文件 “C:\Users\Sid\Anaconda3\lib\site-packages\django\core\handlers\base.py” 在 _get_response 128. response = self.process_exception_by_middleware(e, request)

文件 “C:\Users\Sid\Anaconda3\lib\site-packages\django\core\handlers\base.py” 在 _get_response 126. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

异常类型:TypeError at /shipper/abc/ 异常值:calendar() 缺少 2 个必需的位置参数:“年”和“月”

【问题讨论】:

你需要从你的 url.py 中提供这两个参数。 @NalinDobhal 这很明显,但我应该在其中传递什么? 我的错。看到一个人回答,你可以按照这种方法。然后您的 url 结构将类似于 abc/2019/July,否则您可以删除这些位置参数并使用 get params。在这种情况下,您的网址结构将是 abc/?month=July&year=2019 或 abc/?month=07&year=2019 【参考方案1】:

您必须在urls.py 中添加yearmonths 作为参数

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)

【讨论】:

但这只会改变路径,不是吗? 不,它不会改变路径。它告诉 Django 您在calendar() 中定义的monthyear 的值将从url 中检索(例如:abc/2019/05)。 request 之后的任何参数都必须添加到 urls.py 中,否则 Django 将引发错误。 我把它改成了path('abc/2019/05/', teachers.calendar, name='cal'),,但它仍然说 calendar() 缺少 2 个必需的位置参数 你必须保持这样:path('abc/&lt;int:year&gt;/&lt;int:month&gt;/', teachers.calendar, name='cal'),这只是一个例子 它确实有效,但这样我每次想查看任何月份的日历时都必须专门打开链接。它不应该创建一个由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') 提取的月份的日历吗?

以上是关于Django 应用程序中的 HTMLCalendar:缺少参数的主要内容,如果未能解决你的问题,请参考以下文章

python django应用中的model啥作用

Django 中的应用程序级别设置

Django 应用程序中的 HTMLCalendar:缺少参数

另一个程序中的 Django 服务器

Django 应用程序中的 Ajax 架构

django 可重用应用程序:删除迁移中的依赖项?