#やっていること
現在自作のカレンダーをテンプレートで表示しようとしています。
もともと違うプロジェクトとしてカレンダーを作成しており、その中から
個人で作成しているプロジェクトにも同じカレンダーを表示しようと思い、
動くものをコピーしてモジュールと紐づけました。
#困っていること
動いているものをそのままコピーし、値などを現在作成しているプロジェクトの
models.pyに合わせましたが、うまく動いてくれません。
テンプレートタグの呼出も{% load test %}と書いており、うまく読み込んでいると
思いますが原因がわかりません。
#ソース
views.py
views.py
1class ShopCalendar(generic.TemplateView): 2 template_name = 'test/calendar.html' 3 4 def get_context_data(self, **kwargs): 5 context = super().get_context_data(**kwargs) 6 shop = get_object_or_404(Shop, pk=self.kwargs['pk']) 7 today = datetime.date.today() 8 9 # どの日を基準にカレンダーを表示するかの処理。 10 # 年月日の指定があればそれを、なければ今日からの表示。 11 year = self.kwargs.get('year') 12 month = self.kwargs.get('month') 13 day = self.kwargs.get('day') 14 if year and month and day: 15 base_date = datetime.date(year=year, month=month, day=day) 16 else: 17 base_date = today 18 19 # 基準日から1日分の日付を作成 20 days = [base_date + datetime.timedelta(days=day) for day in range(1)] 21 start_day = days[0] 22 end_day = days[-1] 23 24 # 11時から18時まで15分刻み、1日分のカレンダーを作る 25 calendar = {} 26 for minute in range(660, 1140, 15): 27 row = {} 28 for day in days: 29 row[day] = [] 30 calendar[minute] = row 31 32 33 # カレンダー表示する最初と最後の日時の間にある予約を取得する 34 start_time = datetime.datetime.combine(start_day, datetime.time(hour=11, minute=0, second=0)) 35 end_time = datetime.datetime.combine(end_day, datetime.time(hour=18, minute=0, second=0)) 36 for schedule in Schedule.objects.filter(shop=shop).exclude(Q(start__gt=end_time) | Q(end__lt=start_time)): 37 local_dt = timezone.localtime(schedule.start) 38 yoyaku_date = local_dt.date() 39 yoyaku_minute = local_dt.hour * 60 + local_dt.minute 40 if yoyaku_minute in calendar and yoyaku_date in calendar[yoyaku_minute]: 41 calendar[yoyaku_minute][yoyaku_date].append(schedule) 42 43 44 context['shop'] = shop 45 context['calendar'] = calendar 46 context['days'] = days 47 context['start_day'] = start_day 48 context['end_day'] = end_day 49 context['before'] = days[0] - datetime.timedelta(days=1) 50 context['next'] = days[-1] + datetime.timedelta(days=1) 51 context['now'] = datetime.datetime.now() 52 context['today'] = today 53 context['public_holidays'] = settings.PUBLIC_HOLIDAYS 54 return context
models.py
models.py
1class Company(models.Model): 2 companyname = models.CharField (max_length=100) #会社名 3 4 def __str__(self): 5 return self.companyname 6 7# 店舗情報 ログイン情報 8class Shop(models.Model): 9 user = models.ForeignKey( 10 settings.AUTH_USER_MODEL, verbose_name='ログインユーザー', on_delete=models.CASCADE 11 ) 12 company = models.ForeignKey(Company, verbose_name='会社', on_delete=models.CASCADE) 13 shopname = models.CharField (max_length=100) #店舗名 14 class Meta: 15 constraints = [ 16 models.UniqueConstraint(fields=['user', 'company'], name='unique_shop'), 17 ] 18 19 def __str__(self): 20 return f'{self.company.companyname} - {self.shopname}' 21 22class Schedule(models.Model): 23 """予約スケジュール.""" 24 start = models.DateTimeField('開始時間') 25 end = models.DateTimeField('終了時間') 26 name = models.CharField('名前', max_length=255) 27 shop = models.ForeignKey('Shop', verbose_name='店舗', on_delete=models.CASCADE) 28 29 def __str__(self): 30 start = timezone.localtime(self.start).strftime('%Y/%m/%d %H:%M:%S') 31 end = timezone.localtime(self.end).strftime('%Y/%m/%d %H:%M:%S') 32 return f'{self.name} {start} ~ {end} {self.shop}'
urls.py
urls.py
1from django.urls import path 2from . import views 3 4urlpatterns = [ 5 path('', views.CompanyList.as_view(), name='company_list'), 6 path('company/<int:pk>/shop/', views.ShopList.as_view(), name='shop_list'), 7 path('shop/<int:pk>/calendar/', views.ShopCalendar.as_view(), name='calendar'), 8 path('shop/<int:pk>/calendar/<int:year>/<int:month>/<int:day>/', views.ShopCalendar.as_view(), name='calendar'),
テンプレートタグ
test.py
1import datetime 2from django import template 3from django.utils import timezone 4 5register = template.Library() 6 7 8@register.simple_tag 9def get_display_time(value): 10 hour = value // 60 11 minute = value % 60 12 return f'{hour}時{minute}分' 13 14@register.simple_tag #1時間前の締切処理 15def is_1hour_later(dt, minute): 16 later_1hour = datetime.datetime.now() + datetime.timedelta(minutes=60) 17 hour = minute // 60 18 target = datetime.datetime.combine(dt, datetime.time(hour=hour, minute=0, second=0)) 19 return later_1hour <= target
#エラー内容
NoReverseMatch at /shop/1/calendar/
Reverse for 'calendar' with arguments '(1, 2020, 8, 24, 900)' not found. 2 pattern(s) tried: ['shop/(?P<pk>[0-9]+)/calendar/(?P<year>[0-9]+)/(?P<month>[0-9]+)/(?P<day>[0-9]+)/$', 'shop/(?P<pk>[0-9]+)/calendar/$']
#最後に
エラー内容が解読できないため皆さんの力を貸してください。
よろしくお願いいたします。
#補足
17時以降にテンプレートを表示してみたところカレンダーが表示されました。
おそらく、テンプレートタグの中で処理している1時間前処理が悪さをしているようです。
(ソース自体はコピペしただけなのでなぜそうなっているかはいまだ不明。)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。