Django - нужна помощь с рефакторингом - PullRequest
0 голосов
/ 31 октября 2019

Я создаю сайт 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)

Чтобы описать, что происходит, пользователь сначала заходит на сайт и выбираетдата начала и окончания бронирования квартиры. Они нажимают кнопку, чтобы рассчитать общую стоимость бронирования, страница обновляется и отображает цены. Затем они нажимают кнопку «подтвердить бронирование», которая отправляет запрос на бронирование с резервированием, страница обновляется еще раз, и теперь отображается текст «Спасибо за бронирование».

Есть ли способ, которым яможет улучшить эту точку зрения? Я сделал все, что мог, я все еще учусь джанго. Возможно, мне следует изменить его на представление на основе классов, но не знаю, как это сделать, это довольно запутанно.

Я был бы очень признателен за помощь в этом, большое спасибо!

1 Ответ

1 голос
/ 31 октября 2019

Одним из предложений было бы узнать о взглядах на основе классов в Django. Это поможет уменьшить часть стандартного кода, который вы должны делать постоянно (если request.method == "POST", form.is_valid () и т. Д.). Занятия также помогут организовать ваш код. Вот хороший ресурс, чтобы помочь с использованием представлений на основе классов: Классные представления на основе классов

Еще одним предложением было бы прочитать Прагматичный программист Энди Ханта и Дейва Томаса,Это действительно помогает вам задуматься о планировании кода и о возможных будущих изменениях и т. Д. Также обсуждается принцип СУХОГО (не повторяйте себя).

С точки зрения вашего кода, я бы порекомендовал разделить некоторую логикудо меньших функций. Вы также создаете экземпляр ReservationForm перед POST, а затем создаете его снова внутри POST (дублирующий код). У вас также есть дубликат if request.method == "GET":.

Здесь тоже не вопрос, но для Обмен стеками обзора кода

...