Django发送表单数据视图并返回临时

2024-04-27 00:24:57 发布

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

我试图从表单中捕获数据并将其发送到视图,以便在那里执行一些业务逻辑。你知道吗

我有一个“预订”网站项目,我希望用户选择开始和结束日期(我有一个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来做这个。你知道吗

编辑: 型号:

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

Tags: nameselfformidtruedatemodelsstart
1条回答
网友
1楼 · 发布于 2024-04-27 00:24:57

根据提供的评论,我想我已经理解了这个问题。您希望将价格也传递到HTML页面上。你知道吗

必须将全局变量定义为start_date_priceend_date_pricecontext。你知道吗

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}}

相关问题 更多 >