有点像这里发布的问题的后续(Django:通过自定义模板标签使用用户输入修改数据?),但自从提出这个问题以来,我决定采取不同的方法。正如你所知,我是个新手,所以请放轻松。
我希望 Django 应用程序中有一个每周日历,显示数据库中的班次。以下是 Shift 模型。
class Shift(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='shifts',
blank=True, null=True) # A shift may not have an owner.
# Choices for fields. Add more choices as necessary.
DAYS = (
('M', 'Monday'),
('TU', 'Tuesday'),
('W', 'Wednesday'),
('TH', 'Thursday'),
('F', 'Friday'),
('SA', 'Saturday'),
('SU', 'Sunday'),
)
day_of_the_week = models.CharField(max_length=2, choices=DAYS, blank=True, null=True)
start_date = models.DateField(blank=True, null=True)
end_date = models.DateField(blank=True, null=True)
start_time = models.TimeField(default='12:00:00')
end_time = models.TimeField(default='14:00:00')
hours = models.DurationField(editable=False)
activated = models.BooleanField(verbose_name='Activate', default=False)
sale_status = models.BooleanField(verbose_name='Activate sale', default=False)
...
def save(self, *args, **kwargs): # Overwrite save() to calculate and save the duration of a shift.
temp_date = datetime(1,1,1,0,0,0)
self.hours = datetime.combine(temp_date, self.end_time) - datetime.combine(temp_date, self.start_time)
super(Shift, self).save(*args, **kwargs)
管理员创建班次并将所有者分配给班次。一旦分配了所有者,所有者就可以出售班次,这将发生变化sale_status=False
to sale_status=True
。然后其他用户可以购买班次,更改owner
向买方的转变和转变的sale_status
to False
。理想情况下,这些操作(销售和购买班次)可以通过日历通过单击班次来执行。这意味着日历必须显示其所有班次activated=True
.
我已经研究了一段时间并决定使用全日历。展望未来,我知道我必须修改我的views.py
用于 AJAX 视图并为日历创建模板,但我不知道该怎么做。我的模板目前如下所示:
<head>
<link rel='stylesheet' href='fullcalendar/fullcalendar.css' />
<script src='lib/jquery.min.js'></script>
<script src='lib/moment.min.js'></script>
<script src='fullcalendar/fullcalendar.js'></script>
</head>
<div id="calendar"></div>
<script type='text/javascript'>
$(document).ready(function() {
// page is now ready, initialize the calendar...
$('#calendar').fullCalendar({
// put your options and callbacks here
events: "shifts/eventsFeed",
weekends: false,
editable: false,
})
});
</script>
这显然是错误的(没有使用 Django 的模板语言,没有实现 eventsFeed 等),但我不知道如何从这里开始。
任何帮助,尤其是代码片段的帮助,将不胜感激。
Thanks!
Edit:所以我能够使用以下代码加载日历:
// in views.py
def view_shifts(request):
"""
View for displaying activated shifts in a weekly calendar format.
"""
activated_shifts = Shift.objects.filter(activated=True) # Get all the activated shifts.
shifts = [] # place holder
for shift in activated_shifts:
temp = OrderedDict()
temp['id'] = shift.id
temp['title'] = shift.title
temp['start'] = str(shift.start_date) + 'T' + str(shift.start_time)
temp['end'] = str(shift.end_date) + 'T' + str(shift.end_time)
shifts.append(temp)
calendar_config_options = {'header': {
'left': 'prev,next today',
'center': 'title',
'right': 'month,agendaWeek,agendaDay'
},
'defaultView': 'agendaWeek',
'editable': 'True', # View only.
'events': json.dumps(shifts),
'firstDay': 1 # Week starts on Monday.
}
return render(request, 'shifts/full_calendar.html', {'calendar_config_options': calendar_config_options})
我还添加了该字段title
to my Shift
。它只是字符串表示形式self.owner
。
我的模板称为calendar_init.html
,如下:
<script type="text/javascript">
$(document).ready(function() { // Page is ready.
// Initialize the calendar.
$('#calendar').fullCalendar({{ calendar_config_options }});
});
</script>
现在,当渲染模板时,我得到以下信息:
<!DOCTYPE html>
<head>
<title>Shifts</title>
...
<script type="text/javascript">
$(document).ready(function() { // Page is ready.
// Initialize the calendar.
$('#calendar').fullCalendar({'firstDay': 1, 'header': {'right': 'month,agendaWeek,agendaDay', 'center': 'title', 'left': 'prev,next today'}, 'defaultView': 'agendaWeek', 'editable': True, 'events': '[{"id": 61, "title": "Unclaimed", "start": "2015-07-21T14:00:00", "end": "2015-07-21T16:00:00"}, {"id": 62, "title": "slee17", "start": "2015-07-21T12:00:00", "end": "2015-07-21T14:00:00"}]'});
});
</script>
</head>
<body>
<div id="calendar"></div>
然而,日历仍然没有加载班次。我尝试过使用json.loads(json.dumps(shifts))
代替json.dumps(shifts)
并且还尝试使用来自的辅助函数http://robotfantastic.org/serializing-python-data-to-json-some-edge-cases.html。两者都没有在日历上添加轮班。我在这里做错了什么? (日历仍在加载中,其配置与我配置的相同,但日历为空。)
另外,还有两个小问题:
1)当我说'edtiable': True
代替'editable': 'True'
,页面变为空白,没有错误。为什么会这样呢?我也尝试过做'weekends'='False'
,它仍然显示带有周末的日历,因此在涉及布尔值时,日历显然没有正确配置。我不确定为什么,因为其他配置设置(例如header
, defaultView
, and firstDay
)一切似乎都运行良好。
2)我使用 OrderedDict() 因为我怀疑尝试加载时顺序很重要events
日历,但我不确定这是否属实。我可以只使用普通的 Python 字典吗?