我需要一些关于如何为表单创建动态选择字段的指导。上下文是约会的上下文。我想让人们能够自行预约,但需要基于某些标准。标准是日期、时间和人数。
我希望时间字段是一个动态选择字段。基于日期和派对规模“psize” 我本来以为可以通过filter、aggregate、sum来实现。使用从中归档的任何人的输入。
我在想我可以从表格中获取日期和聚会规模,并使用它来过滤和总结选择相同选择的人数(这很重要,因为我希望 15 人或更少的人注册任何给定时间段)我的时间段以 15 分钟为增量,并列在一个元组中(如常规选择字段)。有什么想法吗?
模型.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 和日期输入填充我的时间字段。关于开始的好地方有什么想法吗?教程可能?
最佳答案
假设您的用户插入了一个值 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
总数。
关于Django 动态选择字段,约会槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53073965/