【问题标题】:Django - Getting specific data from modelDjango - 从模型中获取特定数据
【发布时间】:2019-10-11 16:53:46
【问题描述】:

我正在尝试建立一个预订系统(公寓)。这个想法是,用户可以选择开始日期和结束日期,然后在没有预订的情况下预订公寓。

我有一个带有“start_date”和“end_date”的 Reservation 模型,用于确定公寓预订的日期。

使用 JQuery Ui Date Picker(一个小日历)来选择日期。 “不可用”日期显示为灰色。 我就是这样做的:

<script type="text/javascript">
        var unavailableDates = ['{{ reservation.all.0.start_date|date:"d-m-Y" }}', '{{ reservation.all.0.end_date|date:"d-m-Y" }}'];
        console.log(unavailableDates);
        function unavailable(date) {
            dmy = date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getFullYear();
            if ($.inArray(dmy, unavailableDates) == -1) {
                return [true, ""];
            } else {
                return [false, "", "Unavailable"];
            }
        }

        $(function () {
            $("#datepicker").datepicker({
                dateFormat: 'MM-dd-yy',
                beforeShowDay: unavailable
            });

        });
    </script>


我正在使用...

{{ reservation.all.0.start_date|date:"d-m-Y" }}

...使日历中的日期变灰。

我的预订模型如下所示:

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, unique=True)
    end_date = models.DateField(blank=True, null=True, unique=True)
    name = models.CharField(default="", max_length=200, unique=True)

    def __str__(self):
        return self.name

在我看来,我有:

def apartment_view(request, apartment_id):

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

    form = ReservationForm()
    if request.method == 'GET':
        form = ReservationForm()

    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('/booking/')
    args = {}
    args['form'] = form
    args['apartment'] = context
    args['reservation'] = reservation
    return render(request, 'booking/apartment.html', args)

因为我需要将我的预订过滤到正确的公寓。

我的问题是,如何查询与公寓相关的所有日期,包括开始日期和结束日期?

所以我需要公寓 1 的所有日期,然后是公寓 2 的所有日期......等等。

我不知道该如何继续,如果帖子令人困惑,我深表歉意。

谢谢!!!

【问题讨论】:

  • 请添加您的完整视图代码。我不完全确定你想要完成什么?你说的是文章?
  • 嗨,Alex,感谢您的回答。这篇文章是一个“错字”。我想要完成的是获得一个公寓的所有预订。因此,如果我去 /apartment1/ 那里我有特定于公寓 1 的预订,当我去 /apartment2/ 时我有特定于公寓 2 的预订等。我可以通过执行 {{ reservation.all.0 逐个访问它们.start_date|date:"dmY" }},但我需要一种方法来获取它们,并可能将它们保存到数组中。

标签: django loops logic


【解决方案1】:

后期编辑: 查看您的 JS 代码后,您可能想在视图中执行以下操作:

import itertools
unavailable_dates = apartment.reservations.values_list('start_date', 'end_date')
context['unavailable_dates'] = list(itertools.chain(*unavailable_dates)) # to convert _list_ of tuples to simple list

您可以获得与这样的公寓相关的预订的开始/结束日期:

apartment = get_object_or_404(Apartment, pk=apartment_id)
context['appartment_reservations_dates'] = apartment.reservations.values_list('start_date', 'end_date')

如果您想直接在 HTML 模板中使用整个 Reservation 对象,您可以这样做:

{% for reservation in apartment.reservation.all %}
    {{ reservation.start_date }} - {{ reservation.end_date }}
{% endfor %}

您的视图可能如下所示:

def apartment_view(request, apartment_id):
    context = dict()

    context['apartment'] = get_object_or_404(Apartment, pk=apartment_id)
    context['reservations'] = apartment.reservations.all() # if you want all existing reservations for this specific appartment

    form = ReservationForm()
    if request.method == 'GET':
        form = ReservationForm()

    elif request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid(): # you can add extra validation here making sure whoever tries to book is booking for an available time interval
            reservation = form.save(commit=False)
            reservation.apartment = apartment
            reservation.save()
            form.save()
            return HttpResponseRedirect('/booking/')

    context['form'] = form
    return render(request, 'booking/apartment.html', args)

【讨论】:

    猜你喜欢
    • 2020-09-19
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2022-11-27
    • 1970-01-01
    • 2018-05-03
    • 2021-11-29
    相关资源
    最近更新 更多