動画大変参考になり、勉強させて頂いております。ありがとうございます。
始めたばかりのプログラミング初学者です。ご教授頂ければ幸いです。
フルスタックチャンネル様の予約サイト作成チュートリアルをもとに、自分の用途に合わせて、店舗→スタッフ→カレンダーではなく、storeモデルなしで、直接スタッフ一覧→というように画面が変わり、予約がとれるようにしたいです。
実際にカレンダーの〇ボタンのリンクに、"{% url 'booking' pk=staff.pk year=datetime.year month=datetime.month day=datetime.day hour %}"を記述すると、
ValueError("Don't mix *args and **kwargs in call to reverse()!")
というものが表示されてしまいカレンダー画面が見れなくなってしまいます。pkやhourの取得がうまくいっていないとも出たりします。
urlpatterns=[
path('lesson/<int:pk>', views.CalendarView.as_view(), name='calendar'),
path('calendar/<int:pk>/<int:year>/<int:month>/<int:day>',views.CalendarView.as_view(),name='calendar'),
path('booking/<int:pk>/<int:year>/<int:month>/<int:day>/<int:hour>/', views.BookingView.as_view(), name='booking')
class CalendarView(View):
template_name = "blog/calender.html"
def get(self,request, pk,*args,**kwargs):
staff_data = Staff.objects.filter(id=pk).select_related('user').first()
today = date.today()
year = self.kwargs.get('year')
month = self.kwargs.get('month')
day = self.kwargs.get('day')
if year and month and day:
start_date = date(year=year, month=month,day=day)
else:
start_date = today
days = [start_date + timedelta(days=day) for day in range(7)]
start_day = days[0]
end_day = days[-1]
calendar = {}
for hour in range(10,22):
row = {}
for day in days:
row[day] = True
calendar[hour] = row
start_time = make_aware(datetime.combine(start_day, time(hour=10,minute=0,second=0)))
end_time = make_aware(datetime.combine(end_day, time(hour=20,minute=0,second=0)))
booking_data = Booking.objects.filter(staff=staff_data).exclude(Q(start__gt=end_time) | Q(end=start_time))
for booking in booking_data:
local_time = localtime(booking.start)
booking_date = local_time.date()
booking_hour = local_time.hour
if (booking_hour in calendar) and (booking_data in calendar[booking_hour]):
calendar[booking_hour][booking_date] = False
return render(request,'blog/calendar.html',{
'staff_data':staff_data,
'calendar':calendar,
'days':days,
'start_day':start_day,
'end_day':end_day,
'before':days[0] - timedelta(days=7),
'next':days[-1] + timedelta(days=1),
'today':today,
'pk':pk
},)
class BookingView(View):
def get(self,request,pk,*args,**kwargs):
staff_data = Staff.objects.filter(id=pk).select_related('user').first()
year = self.kwargs.get('year')
month = self.kwargs.get('month')
day = self.kwargs.get('day')
hour = self.kwargs.get('hour')
form = BookingForm(request.POST or None)
return render(request, 'blog/booking.html', {
'staff_data':staff_data,
'year':year,
'month':month,
'day':day,
'hour':hour,
'form':form,
})
def post(self,request, pk, *args,**kwargs):
staff_data = Staff.objects.filter(id=pk).select_related('user').first()
year = self.kwargs.get('year')
month = self.kwargs.get('month')
day = self.kwargs.get('day')
hour = self.kwargs.get('hour')
start_time = make_aware(datetime(year=year,month=month,day=day,hour=hour))
end_time = make_aware(datetime(year=year,month=month,day=day,hour=hour + 1))
booking_data = Booking.objects.filter(staff=staff_data, start=start_time)
form = BookingForm(request.POST or None)
if booking_data.exists():
form.add_error(None,'既に予約があります。\n別の日時で予約をお願いします。')
else:
if form.is_valid():
booking = Booking()
booking.staff = staff_data
booking.start = start_time
booking.end = end_time
booking.name = form.cleaned_data['name']
booking.phone = form.cleaned_data['phone']
booking.remarks = form.cleaned_data['remarks']
booking.save()
return redirect('lesson')
return render(request, 'blog/booking.html',{
'staff_data':staff_data,
'year':year,
'month': month,
'day':day,
'hour':hour,
'form':form
})
なにが正解なのかわからなかったので、いくつかpkの取得に関して情報を調べて、書き換えてみるなど試しました。
回答頂きありがとうございます。
色々いじっていたら、結構大変な状況になってしまったので、店舗モデル用意してやり直そうと思います。
店舗がない場合を構築しようとすると、構成がガラリと変わり全ファイルの修正が必要になります。
githubを展開して頂いたら、時間がある時に見てみます。