質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

752閲覧

【Django】NoReverseMatchのエラーで困っています。

setuna0531

総合スコア128

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/24 07:35

編集2020/08/24 08:09

#やっていること
現在自作のカレンダーをテンプレートで表示しようとしています。

もともと違うプロジェクトとしてカレンダーを作成しており、その中から
個人で作成しているプロジェクトにも同じカレンダーを表示しようと思い、
動くものをコピーしてモジュールと紐づけました。

#困っていること
動いているものをそのままコピーし、値などを現在作成しているプロジェクトの
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時間前処理が悪さをしているようです。
(ソース自体はコピペしただけなのでなぜそうなっているかはいまだ不明。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自分が作成したテンプレートを確認したところ、
テンプレートを表示したさらに先のURLの記載が間違っており
読み込むことができなくなっていました。

17時過ぎて表示できたのは、締切時間過ぎたものを「-」にするという
処理を流しているため、リンク表示が条件から外れたためカレンダーが出ました。

自己解決しましたので大丈夫です。
皆様ありがとうございました!

投稿2020/08/24 08:43

setuna0531

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問