Django需要一些重构/改进vi的帮助吗

2024-06-17 07:59:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个airbnb网站作为一个项目,我已经创建了这个怪物(是的,我知道):


def apartment_view(request, apartment_id):

    reservation = Reservation.objects.filter(apartment__pk=apartment_id)
    apartment = get_object_or_404(Apartment, pk=apartment_id)
    context = {}
    context['apartment'] = apartment

    unavailable = []
    for start, end in apartment.reservations.values_list('start_date', 'end_date'):
        while start <= end:
            unavailable.append(start.strftime('%-d-%m-%Y'))
            start += datetime.timedelta(days=1)
    form = ReservationForm()
    context['unavailable_dates'] = json.dumps(unavailable)
    context['form'] = form

    if request.method == 'GET':
        form = ReservationForm()
        if request.method == "GET":
             form = ReservationForm(request.GET)
             if form.is_valid():
                context = {}
                reservation = form.save(commit=False)
                reservation.apartment = apartment                      
                start_date = request.GET.get('start_date', None)
                end_date = request.GET.get('end_date', None)
                sdate = datetime.datetime.strptime(start_date, '%Y-%m-%d') #start
                edate = datetime.datetime.strptime(end_date ,'%Y-%m-%d') #end
                prices_by_date = apartment.price_by_date(sdate, edate)
                user_dates = [sdate + datetime.timedelta(days=x) for x in range((edate-sdate).days + 1)]
                user_date_list = []
                for day in user_dates:
                    user_date_list.append(day.strftime('%d,%m,%Y'))

                context['price_per_day'] = prices_by_date.price
                context['total_price'] =  len(user_date_list) * prices_by_date.price    
                context['unavailable_dates'] = json.dumps(unavailable)
                context['form'] = form
                context['apartment'] = apartment           
                context['date_start'] = start_date
                context['date_end'] = end_date 
                form.save()
                return render(request, "booking/apartment.html", context)

    elif request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid():            
            reservation = form.save(commit=False)
            reservation.apartment = apartment
            reservation.save()        
            form.save()
            HttpResponseRedirect(reverse('booking:apartment', kwargs={"apartment_id": apartment.pk}))

    return render(request, 'booking/apartment.html', context)

为了描述发生了什么,用户首先来到这个站点,选择开始和结束日期来预订公寓。他们按下按钮来计算预订的总价,页面被刷新并显示价格。 然后他们点击一个“确认预订”按钮,对预订进行post请求,页面再次刷新,现在显示“感谢您的预订”文本。你知道吗

我有什么办法可以改善这种看法吗?我已经尽力了,我还在学django。我也许应该把它改成基于类的视图,但是我不知道怎么做,这很让人困惑。你知道吗

我真的很感谢你的帮助,非常感谢!你知道吗


Tags: formidgetdatetimedaterequestsavecontext
1条回答
网友
1楼 · 发布于 2024-06-17 07:59:18

一个建议是了解Django中基于类的视图。这将有助于减少您必须一直执行的一些样板代码(如果请求.方法==“发布”,表格.u有效吗()等)。这些类还有助于组织代码。下面是一个很好的资源,可以帮助您使用基于类的视图:Classy Class Based Views

另一个建议是阅读安迪·亨特和戴夫·托马斯的The Pragmatic Programmer。这确实有助于您考虑如何规划代码以及如何考虑未来可能的更改等。它还讨论了枯燥的原则(不要重复自己)。你知道吗

就您的代码而言,我建议您将一些逻辑拆分为更小的函数。您还将在POST之前实例化ReservationForm,然后在POST内部再次实例化它(重复代码)。您还有重复的if request.method == "GET":。你知道吗

这不是这里的问题,而是Code Review Stack Exchange

相关问题 更多 >