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', ' ')
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
中添加year
和months
作为参数
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()
中定义的month
和year
的值将从url 中检索(例如:abc/2019/05)。 request
之后的任何参数都必须添加到 urls.py
中,否则 Django 将引发错误。
我把它改成了path('abc/2019/05/', teachers.calendar, name='cal'),
,但它仍然说 calendar() 缺少 2 个必需的位置参数
你必须保持这样:path('abc/<int:year>/<int:month>/', 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:缺少参数的主要内容,如果未能解决你的问题,请参考以下文章