Django - отправка формы просмотра данных и возврата к шаблону - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь получить данные из моей формы и отправить их на мой взгляд, чтобы я мог выполнять некоторую бизнес-логику там.

У меня есть проект веб-сайта «бронирования», я хочу, чтобы пользователь выбрал началои даты окончания (у меня есть шаблон выбора даты jquery в моем шаблоне), и при отправке формы отправьте его на мой взгляд (и БД). Затем мое представление сравнивает даты с ценами, хранящимися в базе данных, чтобы узнать цену за каждый день, и при перенаправлении после отправки формы данные отображаются на веб-сайте.

Надеюсь, что это имеет смысл.

Вот мой взгляд:

def apartment_view(request, apartment_id):

    reservation = Reservation.objects.filter(apartment__pk=apartment_id)
    apartment = get_object_or_404(Apartment, pk=apartment_id)

    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()
    if request.method == 'GET':
        form = ReservationForm()
        date = request.GET.get('reservation.start_date')
        print(date)

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

    context = {}
    context['form'] = form
    context['apartment'] = apartment
    context['unavailable_dates'] = json.dumps(unavailable)

моя форма:

class ReservationForm(forms.ModelForm):
    class Meta:
        model = Reservation
        fields = [
            'start_date',
            'end_date',
            'name',
        ]
        widgets = {
            'start_date': TextInput(attrs={'id': 'datepicker'}),
            'end_date': TextInput(attrs={'id': 'datepicker2'}),
        }
<form method="POST" class="post-form">{% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="form-btn save btn btn-default">Send</button>
</form>

Может кто-нибудь помочь мне понять, как я могу сделать это самостоятельно? Спасибо.

Я не могу использовать JS для этого.

edit: models:

class Apartment(models.Model):
    title = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    city = models.CharField(max_length=100)
    state = models.CharField(max_length=100)
    zipcode = models.CharField(max_length=20)
    description = models.TextField(blank=True)
    apartment_price = models.IntegerField()
    bedrooms = models.IntegerField()
    bathrooms = models.DecimalField(max_digits=2, decimal_places=1)
    garage = models.IntegerField(default=0)
    size = models.IntegerField()
    photo_main = models.ImageField(upload_to='photos/%Y/%m/%d/')
    list_date = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.title


class ApartmentImages(models.Model):
    apartment = models.ForeignKey(Apartment, on_delete="models.CASCADE", related_name="image")
    image = models.ImageField("image")

    def __str__(self):
        return self.image.url



class ApartmentPrices(models.Model):
    apartment = models.ForeignKey(Apartment, on_delete="models.CASCADE", related_name="price")
    price_start_date = models.DateField(blank=True, null=True)
    price_end_date = models.DateField(blank=True, null=True)
    price = models.IntegerField()

    def __str__(self):
        return self.apartment.title


class Reservation(models.Model):
    apartment = models.ForeignKey(Apartment, related_name='reservations',
                                  on_delete=models.CASCADE, blank=True, null=True)
    start_date = models.DateField(blank=True, null=True)
    end_date = models.DateField(blank=True, null=True)
    name = models.CharField(default="", max_length=200)

    def __str__(self):
        return self.name

1 Ответ

0 голосов
/ 17 октября 2019

Полагаю, я понял вопрос, основываясь на предоставленных комментариях. Вы также хотите передать цену на страницу HTML.

Вы должны определить глобальные переменные как start_date_price и end_date_price и context.

def apartment_view(request, apartment_id):
    context = {}
    start_date_price = 0
    end_date_price = 0

    reservation = Reservation.objects.filter(apartment__pk=apartment_id)
    apartment = get_object_or_404(Apartment, pk=apartment_id)

    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()
    if request.method == 'GET':
        form = ReservationForm()
        date = request.GET.get('reservation.start_date')
        print(date)

    elif request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid():
            start_date = form.cleaned_data.get('start_date')
            end_date = form.cleaned_data.get('end_date')

            reservation = form.save(commit=False)
            reservation.apartment = apartment
            reservation.save()
            form.save()

            # your logic here
            start_date_price = start_date * your_logic
            end_date_price = end_date * your_logic 
            context['start_date_price'] = start_date_price
            context['end_date_price'] = end_date_price

            # I would suggest remove this line and check, when the form renders, it would display all the values there itself
            #return HttpResponseRedirect(reverse('booking:apartment', kwargs={'apartment_id': apartment.pk}))
    context['form'] = form
    context['apartment'] = apartment
    context['unavailable_dates'] = json.dumps(unavailable)

Теперь на странице HTML:

<form method="POST" class="post-form">{% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="form-btn save btn btn-default">Send</button>
</form>
 {{start_date_price}}
 {{end_date_price}}
...