Django开业时间表

2024-05-19 03:42:06 发布

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

上下文

我需要建立一个表格集,允许一周的开放时间。在

状态

以下是我的开场时间模型:

WEEKDAYS = [
  (1, _("Monday")),
  (2, _("Tuesday")),
  (3, _("Wednesday")),
  (4, _("Thursday")),
  (5, _("Friday")),
  (6, _("Saturday")),
  (7, _("Sunday")),
]

class OpeningHours(models.Model):
    user = models.ForeignKey(User)
    weekday = models.IntegerField(choices=WEEKDAYS)
    from_hour = models.TimeField()
    to_hour = models.TimeField()
    class Meta:
        unique_together = (('user', 'weekday'),)

下面是如何为默认的周设置生成表单集

^{pr2}$

下面是我如何获得当前用户的开放时间

user_hours = request.user.openinghours_set.all()

问题

如何将用户小时数输入表单集?在


编辑

例如,假设用户已经在数据库中设置了星期一和星期四的时间,格式应该类似于:

weekday: Monday
from_hour: '09:00' # user_set
to_hour: '19:00' # user_set

weekday: Tuesday
from_hour: # default initial value
to_hour: # default initial value

weekday: Wednesday
from_hour: # default initial value
to_hour: # default initial value

weekday: Thursday
from_hour: '13:00' # user_set
to_hour: '15:00' # user_set

weekday: Friday
from_hour: # default initial value
to_hour: # default initial value

weekday: Saturday
from_hour: # default initial value
to_hour: # default initial value

Tags: to用户fromdefaultvaluemodels时间initial
3条回答

扩展@Rohan的回答:

我不认为modelformset是必要的,只需像这样构造小时

hours = [
    {'weekday': day, 'from_hour': '08:00', 'to_hour': '18:00'} 
    for day in range(1, 8) if not any(request.user.openinghours_set.filter(weekday=day))
    else
    {'weekday': day, 'from_hour': request.user.openinghours_set.filter(weekday=day).from_hour,
     'to_hour': request.user.openinghours_set.filter(weekday=day).to_hour}
]

显然,这是低效的,因为它每天构造一个或三个查询集,所以要这样重写它:

^{pr2}$

我最后得出的结论是:

user_hours = request.user.openinghours_set
hours = []
for day_id in range(0, 6):
    item = {'weekday': day_id, 'from_hour': '08:00', 'to_hour': '18:00'}
    if any(user_hours.filter(weekday=day_id)):
        my_item = user_hours.get(weekday=day_id)
        item['from_hour'] = my_item.from_hour.strftime('%H:%M')
        item['to_hour'] = my_item.to_hour.strftime('%H:%M')
    hours.append(item)

我更喜欢Python式的版本。。。在

您可以使用^{}并提供适当的查询集。在

formset = UserOpeningHoursModelFormSet(queryset=request.user.openinghours_set.filter())

还有一些其他方法可以更改queryset。在

编辑:

在创建formset实例和initial时,可以使用max_num参数。因此,您将从现有实例中获取表单,如果实例不足,将使用来自初始dict的数据创建新表单

^{pr2}$

我还没有对此进行验证,所以我怀疑它可能会为每个初始数据项添加表单。因此,在最坏的情况下,您需要创建hours列表,并跳过设置小时数的天数。在

相关问题 更多 >

    热门问题