Django Javascript解释
我有这个代码,我正在努力理解它-我真的不知道它是如何工作的-Django Javascript解释,javascript,django,Javascript,Django,我有这个代码,我正在努力理解它-我真的不知道它是如何工作的- {% if book %} <script type='text/javascript'> $(document).ready(function() { $.get('/ajax/book/{{ book.id }}/timetable/', {}, function(data) { data = JSON.parse(data);
{% if book %}
<script type='text/javascript'>
$(document).ready(function() {
$.get('/ajax/book/{{ book.id }}/timetable/', {}, function(data) {
data = JSON.parse(data);
var events = new Array();
for (var i in data) {
events.push({
id: data[i].id,
title: '{{ request.user.name }}',
start: Date.parse(data[i].startTime, "yyyy-MM-dd HH:mm:ss"),
end: Date.parse(data[i].endTime, "yyyy-MM-dd HH:mm:ss"),
allDay: false
});
}
var calendar = $('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'agendaDay,agendaWeek'
},
theme: true,
contentHeight: 400,
defaultView: 'agendaWeek',
selectable: true,
selectHelper: true,
eventClick: function(calEvent, jsEvent, view) {
},
select: function(start, end, allDay) {
var title = '{{ request.user.name }}';
$.post('/ajax/book/{{ book.id }}/timetable/new/', {
csrfmiddlewaretoken: getCookie('csrftoken'),
startTime: start.format("yyyy-mm-dd HH:MM:ss"),
endTime: end.format("yyyy-mm-dd HH:MM:ss"),
}, function(data) {
calendar.fullCalendar('renderEvent',
{
title: title,
start: start,
end: end,
allDay: allDay
},
true // make the event "stick"
);
});
calendar.fullCalendar('unselect');
},
editable: true,
events: events,
eventResize: function(event, dayDelta, minuteDelta, revertFunc) {
alert(
"The end date of " + event.title + " has been moved " +
dayDelta + " days and " +
minuteDelta + " minutes."
);
if (!confirm("Is this okay?")) {
revertFunc();
}
}
});
});
});
</script>
我试图做一些类似的事情,除了其他数据,这就是为什么我试图了解它是如何工作的。如果有人能解释给我听,那就太好了 这是一个相当标准的AJAX模式。模板由原始视图按正常方式渲染。在呈现过程中,Javascript中标记为Django模板变量的一些元素被填充-例如
{{book.id}
和{request.user.name}
-因此当它进入浏览器时,这些元素与JS的其余部分无法区分
现在,Javascript调用服务器,传递这些元素。服务器使用JSON数据进行响应,JSON数据由函数解析,该函数是.get
调用的第三个参数。我没有深入研究该函数,但它似乎正在使用该数据实例化fullCalendar
,这可能是一个单独的jQuery脚本
一件稍微奇怪的事情是,AJAX调用设置为在浏览器加载页面后立即运行——通常这样做没有意义,因为您可以简单地将数据包含在原始模板中。通常,AJAX被设置为响应浏览器中的某些事件而执行,例如按钮单击 你不明白什么?JS,Python,什么?我大体上理解发生了什么,因为我通过get请求获取时间段数组,然后在日历中显示它们。然而,我不明白模板是如何被调用的,也不知道如何呈现——比如说,一个用户的所有时隙(在所有书籍中),实际上,我不确定JS和python是如何交谈的,而且,我不确定JS在做什么(尽管我不确定我需要知道我规定的任务)当你说模板是在原始视图中呈现的时候,我不知道你的意思是什么-我看不到这种情况发生了?另外,我是否需要select:函数(开始、结束、全天)来显示日历?您所指的不是这些视图中的任何一个:当用户在浏览器中进入页面时,有一个单独的非Ajax视图负责最初呈现模板。至于
select
功能,您必须查看fullCalendar
的文档:我希望这是一个在日历中选择一天时触发的功能,因此如果您希望在这种情况下发生某些事情,您将需要该功能。
url(r'^ajax/book/(?P<bookid>\d+)/timetable/$', twobooks.ajax.views.book_timetable),
url(r'^ajax/book/(?P<bookid>\d+)/timetable/new/$', twobooks.ajax.views.book_timetable_new),
def book_timetable(request, bookid):
book = get_object_or_404(Book, id=bookid)
rawslots = TimeSlot.objects.filter(user=request.user).filter(book=book)
slots = []
for rawslot in rawslots:
slot = {
'id': rawslot.id,
'startTime': str(rawslot.startTime),
'endTime': str(rawslot.endTime),
}
slots.append(slot)
return HttpResponse(simplejson.dumps(slots))
def book_timetable_new(request, bookid):
book = get_object_or_404(Book, id=bookid)
startTime = datetime.strptime(request.POST['startTime'], "%Y-%m-%d %H:%M:%S")
endTime = datetime.strptime(request.POST['endTime'], "%Y-%m-%d %H:%M:%S")
timeslot = TimeSlot(
user = request.user,
book = book,
startTime = startTime,
endTime = endTime,
)
timeslot.save()
return JSONify("")