【问题标题】:Django dynamic choice field, appointments slotsDjango 动态选择字段,约会位置
【发布时间】:2019-04-04 01:33:49
【问题描述】:

我需要一些关于如何为表单创建动态选择字段的指导。上下文是任命的上下文。我想让人们能够预订自己的约会,但这需要基于一些标准。标准是日期、时间和人数。

我希望时间字段成为动态选择字段。基于日期和派对规模“psize” 我原本以为这可以通过过滤、聚合和求和来实现。使用提交人的输入。

我在想我可以从表格中获取日期和派对人数,并使用它来过滤和汇总选择相同选项的人数(这很重要,因为我希望 15 人或更少的人注册任何给定时间段)我的时间段以 15 分钟为增量,并列在一个元组中(如常规选择字段)。有什么想法吗?

models.py

class Reservation(models.Model):
"""This tuple is for the Inside, Outside, First Available 
drop down menu for the reservations tab """
    INSIDEOUTSIDE = (
        ('Inside','Inside'),
        ('Outside', 'Outside'),
        ('First Available', 'First Available'),
    )

    STATUS = (
        ('Reservation','Reservation'),
        ('Checked In','Checked In'),
        ('Seated','Seated'),
    )

    PARTYSIZE = (
        (1,'1'),
        (2,'2'),
        (3,'3'),
        (4,'4'),
        (5,'5'),
        (6,'6'),
        (7,'7'),
        (8,'8'),
        (9,'9'),
        (10,'10'),
        (11,'11'),
        (12,'12'),
    )    

    TIMEPERIOD= (
        ('11:30','11:30'),
        ('11:45','11:45'), 
        ('12:00','12:00'), 
        ('12:15','12:15'), 
    )


    name = models.CharField(max_length=22)
    psize = models.IntegerField('Party Size', choices= PARTYSIZE)
    Date = models.DateField()
    Time = models.CharField(max_length=15, choices=TIMEPERIOD)
    location = models.CharField(max_length=15, choices= INSIDEOUTSIDE, default= 'First Available')
    status = models.CharField(max_length=15, choices=STATUS, default='Reservation')

下面是有效的过滤器,但不完全是。它返回我在其中键入的项目,我希望能够向它传递一个列表并让它使用零件大小“psize”进行计算,并将一个列表传递回具有可用时隙的表单(时隙人数少于 15 人,包括填入表格的人数)。

Reservation.objects.filter(Date='2018-01-01',Time='2:30').aggregate(Sum('psize'))

谁能指出我正确的方向?有什么想法吗?

更新 下面是我在 shell 中用来确定选择的代码。

def getchoices(request):
    DATE = request.POST.get('Date')
    psize_input = request.post.get('psize')
    slots = Reservation.objects.filter(Date=DATE).values_list('Time').annotate(Sum('psize'))
    TIMEPERIOD= (
    ('11:30','11:30'),
    ('11:45','11:45'),
    ('12:00','12:00'),
    ('12:15','12:15'),
    ('12:30','12:30'),
    ('12:45','12:45'),
    ('01:00','01:00'),
    ('01:15','01:15'),
    ('01:30','01:30'),
    ('01:45','01:45'),
    ('02:00','02:00'),
    ('02:15','02:15'),
    ('02:30','02:30'),
    )
    def checkpsize():
            fullslots1=[]
            fullslots2=[]
            for object in slots:
                    if object[1] > 15-psize_input:
                            fullslots1.append(object[0])
                            fullslots2.append(object[0])
                            fullslotszip = zip(fullslots1, fullslots2)
                            fullslotstup = list(fullslotszip)
                            newchoices = list(filter(lambda x: x not in fullslotstup, TIMEPERIOD))
            return newchoices

但是,我发现很难将其连接到我的表单。我似乎无法弄清楚如何在我的表单中实现 ajax 以根据 psize 和日期输入填充我的时间字段。关于开始的好地方有什么想法吗?可能是教程?

【问题讨论】:

    标签: django python-3.x filter django-rest-framework aggregate


    【解决方案1】:

    假设你的用户插入了一个值psize_input,你可以使用:

     Reservation.objects
        .order_by('Date', 'Time')
        .values('Date', 'Time')
        .annotate(Sum('psize'))  # adds psize sum for each distinct data/time combo
        .filter(psize__sum__lte=15-psize_input)  # filters combos with enough capacity
    

    获取以下形式的字典列表(实际上是ValuesIterable):

    [
        {'Date': datetime.date(2018, 10, 31), 'Time': '11:30', 'psize__sum': 5},
        {'Date': datetime.date(2018, 10, 31), 'Time': '12:15', 'psize__sum': 2},
        {'Date': datetime.date(2018, 11, 1), 'Time': '11:45', 'psize__sum': 7},
        # ...
    ]
    

    准确包含有足够容量的时隙,当前psize 总数在该时隙。

    【讨论】:

    • 这很有帮助,我开始把它拼凑起来。然而,我还有另一个问题。 --如何使用用户在实际提交表单之前在表单中输入的信息(日期、psize)使其工作?示例:我需要用户输入日期和 psize,表单上的时间选择字段将取决于他们的日期和 psize 输入。我希望选择用户只能是具有足够容量的时隙。这可能吗?
    • @nicholasshults 是的。但不是在普通的 django 中,而是在 javascript 中。您必须将所有相关信息传递到 change_form 模板并使用 javascript 在用户输入时操作下拉列表,或者为每个用户输入发出 ajax 请求并相应地处理响应(操作下拉列表)。
    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 2011-09-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多