python - 在 Django 中使用 fullCalendar

标签 python django django-views fullcalendar

有点像此处发布的问题( Django: modifying data with user input through custom template tag? )的后续行动,但自从提出这个问题后,我决定采取不同的方法。正如你所知,我是个新手,所以请放轻松。

我希望 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 更改为 sale_status=True。然后其他用户就可以购买类次,将类次的 owner 更改为买家,并将类次的 sale_status 更改为 False。理想情况下,这些操作(销售和购买类次)可以通过日历通过单击类次来执行。这意味着日历必须显示 activated=True 的所有类次。

我已经研究了一段时间并决定使用 FullCalendar 。展望 future ,我知道我必须修改 AJAX View 的 views.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>

这显然是错误的(不使用 Django 的模板语言,未实现 eventsFeed 等),但我不知道如何从这里开始。

任何帮助,尤其是代码片段,我们将不胜感激。

谢谢!

编辑:所以我能够使用以下代码加载日历:

// 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 添加到我的 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' ,它仍然显示带有周末的日历,因此在涉及 bool 值时,日历显然没有正确配置。我不确定为什么,因为其他配置设置(例如 headerdefaultViewfirstDay)似乎都工作正常。 2)我使用 OrderedDict() 因为我怀疑在尝试将事件加载到日历时顺序很重要,但我不确定这是否属实。我可以只使用普通的 Python 字典吗?

最佳答案

以下是您需要执行的操作的基本概述。创建一个 View ,返回完整日历所期望的 JSON 数据。这做起来非常简单。您可以使用 JsonResponse 手动创建一个自定义的或使用 Django Rest 框架。除非您要创建整个 API,否则我会选择使用 JsonResponse。

对于JsonResponse的格式,需要同时指定starttitle。您可以在完整日历的 docs 中找到其他可能的字段。 .

示例:

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)

关于python - 在 Django 中使用 fullCalendar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31507308/

相关文章:

python - Django 2.0 国际化 | i18n_patterns 不起作用

django - 在 views.py 文件中的所有 View 中运行的代码

django - 不存在匹配查询?

python - torch softmax : What dimension to use?

python - 生成生成集的算法

Django 自定义管理操作 : how to deselect on completion?

python - 上下文 `Order.Items` 未出现在 Django Admin 的 PDF 文件中

Python - 以一种奇怪的方式替换字符串;

python - 找不到模块(或其依赖项之一)。尝试使用带有构造函数语法的完整路径

django - 为什么 DEBUG=False 设置会使我的 django 静态文件访问失败?