フルスタックチャンネル
サインアップサインアップ
ログインログイン
利用規約プライバシーポリシーお問い合わせ
Copyright © All rights reserved | FullStackChannel
解決済
予約サイト構築チュートリアルをもとにさせて頂き、改変したページを作成しようとしたところ起きた、引数の不具合について。
Django
HTML
初心者
daaxish
2023/04/22 06:41

動画大変参考になり、勉強させて頂いております。ありがとうございます。
始めたばかりのプログラミング初学者です。ご教授頂ければ幸いです。

実現したいこと

フルスタックチャンネル様の予約サイト作成チュートリアルをもとに、自分の用途に合わせて、店舗→スタッフ→カレンダーではなく、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の取得に関して情報を調べて、書き換えてみるなど試しました。

回答 2件
login
回答するにはログインが必要です
daaxish
約2年前

回答頂きありがとうございます。
色々いじっていたら、結構大変な状況になってしまったので、店舗モデル用意してやり直そうと思います。

1
はる@講師
約2年前

店舗がない場合を構築しようとすると、構成がガラリと変わり全ファイルの修正が必要になります。

githubを展開して頂いたら、時間がある時に見てみます。