【问题标题】:Use django filter in FullCalendar.io在 FullCalendar.io 中使用 django 过滤器
【发布时间】:2020-11-03 09:46:26
【问题描述】:

我正在我的 Django 项目中制作一个完整的日历,我想使用 django 过滤器来过滤日历。我已经成功地创建了日历和过滤器,但是我不能让它一起工作。

有没有人有在 fullcalendar 中包含 django 过滤器(或其他过滤方法)的经验,或者有解释 fullcalendar 中过滤的文档链接?

这是我的看法:

def kalender2(request):
    all_events = Timing.objects.all()    
    myFilter = CalenderFilter(request.GET, queryset=all_events)
    all_events = myFilter.qs

    if request.GET:  
        event_arr = []
        for i in all_events:
            event_sub_arr = {}
            event_sub_arr['title'] = i.event,i.name 
            start_date = datetime.strptime(str(i.start_time.date()), "%Y-%m-%d").strftime("%Y-%m-%d")
            end_date = datetime.strptime(str(i.end_time.date()), "%Y-%m-%d").strftime("%Y-%m-%d")
            event_sub_arr['start'] = start_date
            event_sub_arr['status'] = i.event.status
            event_sub_arr['end'] = end_date
            event_arr.append(event_sub_arr)
        return HttpResponse(json.dumps(event_arr))

    context = {
        "events":all_events,
        "myFilter":myFilter,
    }
    return render(request,'kalender/kalender.html', context) 

这是日历的脚本和模板:

<script>
document.addEventListener('DOMContentLoaded', function() {
    var calendarEl = document.getElementById('calendar');

    var calendar = new FullCalendar.Calendar(calendarEl, {
      initialView: 'dayGridMonth',
      initialDate: '2020-10-07',
      locale: 'nl',
      slotMinTime: "08:00:00",
      headerToolbar: {
        left: 'prev,next today',
        center: 'title',
        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
      },
      buttonText: {
        timeGridDay: 'Dag',
        today:'Vandaag',
        timeGridWeek: 'Week',
        listWeek: 'Lijst',
        dayGridMonth: 'Maand'
      },
      eventDisplay: 'block',
      events: [
                {% for i in events %}
                {
                    title: "{{ i.event}} {{i.name}}",
                    start: '{{ i.start_time|date:"Y-m-d H:i" }}',
                    end: '{{ i.end_time|date:"Y-m-d H:i" }}',
                    status:'{{i.event.status}}',
                    className: ["event","{{i.event.status}}"],
                    allDay: false,
                },
                {% endfor %}


            ],

    eventTimeFormat: { // like '14:30:00'
        hour: '2-digit',
        minute: '2-digit',
        meridiem: false
    }
     
    });

    calendar.render();
  });

</script>
{% extends "base.html" %}
{% block content %}
{% load crispy_forms_tags %}

<div class=flexbox-container-gantt>
  <div class = "flexbox-item-a-gantt">
    <form class ="filterform"method="GET">
      {{myFilter.form|crispy}}
    <button class="zoeken" type="submit"> Zoeken</button>
    </form>
  </div>
</div>


<div class=flexbox-container-gantt>
  <div class = "flexbox-item-a-gantt">
    <h1 class="title-box"> <i class="fas fa-calendar-plus"></i> Kalender </h1> 
    <hr class="box-line">
      <div class = "width_thing">
           <div id='calendar'></div>
      </div>
  </div>
      
</div>

</div>


{% endblock content %}

更新:我将 i.event 更改为字符串,现在它过滤数据。它在页面上显示原始数据,而不是在日历上,大概是因为 url:http://localhost:8000/Kalender/?event=43&name=1&event_name=。但我不确定这是否会导致它。

【问题讨论】:

  • 嗨,尼克,我假设错误消息是指您视图中的行,您在其中执行event_sub_arr['title'] = i.event。显然,i.event 不是 python 可以轻松序列化的字符串或原始值。如果这没有帮助,请检查并再次写入!一般来说,您的代码看起来不错。
  • 嗨伊夫,感谢您的回复。我已将 i.event 更改为字符串,现在过滤器正在工作。但是,当我使用过滤器时,我最终会进入一个显示原始数据的页面。我认为这是因为 url 正在发生变化。我将编辑我的原始帖子以说明我的意思。
  • 嗨,尼克,当您从 django 插入带有模板标签的数据时,我不确定您在 &lt;script&gt;&lt;/script 中的解决方案效果如何。 Fullcalendar 允许您通过 ajax 从您的视图中检索数据并自行负责解析 (fullcalendar.io/docs/events-json-feed)。我可以想象这会更好。
  • 嗨 Yves,再次感谢您抽出宝贵时间回复我的问题。我现在找到了以下帖子:stackoverflow.com/questions/39902405/fullcalendar-in-django/…。该解决方案使用 Ajax 调用来更新日历。我仍在努力理解如何在我的项目中实现这一点,但链接中答案的最后一部分应该使我能够选择一个值并过滤该特定值的日历。

标签: json django fullcalendar


【解决方案1】:

你可以这样做:

# views.py

def get_events(request):
    all_events = Timing.objects.all()    
    myFilter = CalenderFilter(request.GET, queryset=all_events)
    all_events = myFilter.qs

    event_arr = []
    for i in all_events:
        event_sub_arr = {}
        event_sub_arr['title'] = i.event,i.name 
        start_date = datetime.strptime(str(i.start_time.date()), "%Y-%m-%d").strftime("%Y-%m-%d")
        end_date = datetime.strptime(str(i.end_time.date()), "%Y-%m-%d").strftime("%Y-%m-%d")
        event_sub_arr['start'] = start_date
        event_sub_arr['status'] = i.event.status
        event_sub_arr['end'] = end_date
        event_arr.append(event_sub_arr)
        
       return JsonResponse(event_arr, safe=False) # safe=False is important, because Json actually
      # does not know about 'arrays'

您的 JavaScript 可能如下所示:

<script>
document.addEventListener('DOMContentLoaded', function() {
    var calendarEl = document.getElementById('calendar');

    var calendar = new FullCalendar.Calendar(calendarEl, {
      initialView: 'dayGridMonth',
      initialDate: '2020-10-07',
      locale: 'nl',
      slotMinTime: "08:00:00",
      headerToolbar: {
        left: 'prev,next today',
        center: 'title',
        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
      },
      buttonText: {
        timeGridDay: 'Dag',
        today:'Vandaag',
        timeGridWeek: 'Week',
        listWeek: 'Lijst',
        dayGridMonth: 'Maand'
      },
      eventDisplay: 'block',
      eventSources: [
         // your event source
         {
             url: {% url 'name_of_your_view' %} // here you specify the url of your view
             color: 'yellow',    // an option!
             textColor: 'black'  // an option!
         }
    ],

    eventTimeFormat: { // like '14:30:00'
        hour: '2-digit',
        minute: '2-digit',
        meridiem: false
    }
     
    });

    calendar.render();
  });

</script>

【讨论】:

  • 嗨 Yves,感谢您提供的代码。它肯定会改进从视图到模板的数据处理,我想我将能够使用选择字段基于一个下拉列表进行过滤。不幸的是,我认为我不能将 django 过滤器与 fullcalendar 结合使用。在您的示例中,过滤应该可以工作,但我无法将 myFilter 从 get_events 视图传递到 kalender2 视图(其中包含呈现日历的模板)。
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 2016-03-03
  • 2018-10-04
  • 2010-10-26
  • 2018-07-13
  • 1970-01-01
  • 2013-01-24
  • 2010-10-20
相关资源
最近更新 更多