Python 在Django中使用fullCalendar
这在某种程度上是对此处发布的问题()的后续,但自从提出这个问题后,我决定采取不同的方法。你可以看出我是新手,所以请放轻松 我希望在Django应用程序中有一个每周日历,显示数据库中的班次。以下是移位模型Python 在Django中使用fullCalendar,python,django,django-views,fullcalendar,Python,Django,Django Views,Fullcalendar,这在某种程度上是对此处发布的问题()的后续,但自从提出这个问题后,我决定采取不同的方法。你可以看出我是新手,所以请放轻松 我希望在Django应用程序中有一个每周日历,显示数据库中的班次。以下是移位模型 class Shift(models.Model): owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='shifts', blank=True, null=True) # A shift m
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\u status=False
更改为sale\u status=True
。然后其他用户可以购买班次,将班次的所有者
更改为买方,班次的销售状态
更改为假
。理想情况下,通过单击班次,可以在日历中执行这些操作(销售和购买班次)。这意味着日历必须显示其已激活=True
的所有班次
我已经深入研究了一段时间,决定使用。接下来,我知道我必须为AJAX视图修改我的视图.py
,并为日历创建一个模板,但我不知道该怎么做。我的模板当前如下所示:
<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>
我还将字段title
添加到了我的Shift
。它只是self.owner
的字符串表示形式。
我的模板名为calendar\u 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>
$(document).ready(函数(){//页面已准备就绪。
//初始化日历。
$('#calendar').fullCalendar({{calendar\u config\u options}});
});
现在,当呈现模板时,我得到以下结果:
<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>
转移
...
$(document).ready(函数(){//页面已准备就绪。
//初始化日历。
$(“#calendar”).fullCalendar({'firstDay':1,'标题':{'right':'月,agendaWeek,agendaDay','中间':'title','左':'prev,next today','defaultView':'agendaWeek','可编辑':True,'事件':'[{'id:61,“title:“Unclaims”,“start:”“2015-07-21T14:00:00”,“end:“2015-07-21T16:00”},{'id:62,“title:“17”,“start:”“2015-07-21T12:00:00”,“结束”:“2015-07-21T14:00:00”}];
});
但是,日历仍然没有加载移位。我尝试了使用json.loads(json.dumps(shifts))
而不是json.dumps(shifts)
,还尝试了使用中的帮助函数。两者都没有加载带有移位的日历。我在这里做错了什么?(日历仍在加载中,其配置与我的配置相同,但日历为空。)
还有两个小问题:
1)当我说'edtable':True
而不是'editable':'True'
时,页面变为空白,没有错误。为什么会这样?我也尝试过做'weekends'='False'
,它仍然显示带有周末的日历,所以对于布尔值,日历显然没有正确配置。不过,我不确定为什么,since其他配置设置(如标题
,默认视图
,以及第一天
)似乎都工作正常。
2) 我用过OrderedDict()因为我怀疑在尝试将
事件加载到日历时顺序很重要,但我不确定这是否正确。我可以只使用常规的Python字典吗?以下是您需要做的基本概述。创建一个按照完整日历的预期返回JSON数据的视图。这非常简单。您可以使用Django Rest框架手工创建一个自定义API,或者使用Django Rest框架。除非您创建的是一个完整的API,否则我会使用JsonResponse
至于JsonResponse的格式,您需要同时指定start
和title
。您可以在完整日历中找到其他可能的字段
例如:
from django.http import JsonResponse
def example(request):
data = [
{
'title': 'event1',
'start': '2010-01-01'
},
{
'title': 'event2',
'start': '2010-01-05',
'end': '2010-01-07'
}
]
return JsonResponse(data, safe=False)
非常感谢!我已经采纳了你的建议(稍微调整了细节以使用Django的模板,但仍然是相同的想法)现在我遇到了新的问题。我也编辑了这个问题,但你知道为什么我的日历不会从数据库加载事件吗?看起来你没有按照我的答案设计。你编辑的方法不是使用AJAX,它只是在第一次加载视图时提供所有数据。请不要尝试创建措辞要传递到完整日历的初始值设定项中的一组值。避免这样做应该会引导您自己回答新问题。我可能在这里错了,但我看不出您的方法和我的方法有什么不同(至少从代码片段看),特别是因为我不明白你的代码是如何使用AJAX的。另外,我希望日历首先显示数据库中的所有班次,所以我不想在视图第一次加载时提供所有数据吗?我知道我想在用户购买和出售班次时使用AJAX,但这是为了以后,所有IFT显示在日历中。如果我错了,请随时更正。