【问题标题】:Django/AJAX - New data is not getting rendered after first jQuery AJAX call (i.e. on subsequent calls)Django/AJAX - 在第一次 jQuery AJAX 调用后没有呈现新数据(即在后续调用中)
【发布时间】:2020-04-13 06:28:21
【问题描述】:

我尝试在 AJAX 请求上将缓存属性设置为 false,但它完全没有做任何事情。 我正在实现一个 JS 日历,当您单击任何一天时,它会打开一个弹出叠加层,其中还包含另一个日历。第二个日历是通过 ajax 打开的,一切似乎都在第一个调用上进行,它呈现:

然后,在关闭叠加层并单击日历上的另一个日期时,无论我单击多少次,我总是会得到第一个叠加层。

AJAX 调用

$.ajax( 
                { 
                    type:"POST", 
                    url: "/teachers/teacherDayAgenda/", 
                    data:{ 
                        'event_date': dateClicked
                    }, 
                    dataType: 'json',
                    cache: false,
                    success: function( eventData ) {

                        var lessonEvents = [];
                        var lesson = {};

                        for (var key in eventData) {
                            if (key=="eventDefault")
                                break;
                            lesson = {};
                            lesson['title'] = "Lesson with "+eventData[key]['teacher_name'];
                            lesson['start'] = formatDate(moment(eventData[key]['timeslot_start']).toDate());
                            lesson['end'] = formatDate(moment(lesson['start']).add(40, 'm').toDate());
                            lessonEvents.push(lesson);
                        }
                        console.log(eventData);
                        $('#teacher_schedule').fullCalendar({
                             header: {
                                 left: 'prev,next today',
                                center: 'title',
                                right: 'agendaDay,listWeek'
                            },
                            defaultDate: eventData['event0']['click_event_date'],
                            navLinks: true,
                            eventLimit: true,
                            events: lessonEvents
                        });

                        $("#teacher_schedule .fc-agendaDay-button").trigger("click");
                        /*$('td').removeClass('AddEventPopup_open'); */
                    } 
                }); 

观点:

@login_required
def teacherDayAgenda(request):
    """
    Ajax request for popup overlay, changes to student schedule, see day agenda of availability of teachers
    """
    if request.method == 'POST':
        click_event_date = request.POST['event_date']
        studentid = request.user.id
        default_teacher_id = StudentProfile.objects.has_default_teacher(
            studentid)


        # default event values 
        ev = {}
        d = {'eventDefault': True, 'click_event_date': click_event_date}
        ev['event0'] = d

        if default_teacher_id:
            ev = {}
            events = TeacherProfile.objects.filter(id=default_teacher_id).filter(
                student_id__isnull=True).values_list('timeslot_start', 'teacher_id')
            i=0
            for event in events:
                d = {}
                d['timeslot_start'] = _datetime_to_string(event[0])
                teacherName = User.objects.get_staff_name(event[1])
                d['teacher_name'] = teacherName
                d['click_event_date'] = click_event_date
                ev['event'+str(i)] = d
                i += 1


        else:
            first_teacher_obj = TeacherProfile.objects.get_all_available_teachers()[
                0]
            first_teacher_id = getattr(first_teacher_obj, 'teacher_id')
            events = TeacherAvailability.get_dayagenda(
                request, first_teacher_id, click_event_date)

            i=0
            for event in events:
                d = {}
                d['timeslot_start'] = _datetime_to_string(event[0])
                d['student_id'] = event[1]
                teacherName = User.objects.get_staff_name(event[2])
                d['teacher_name'] = teacherName
                d['click_event_date'] = click_event_date
                ev['event'+str(i)] = d
                i += 1


        return JsonResponse(ev)

    else:
        return HttpResponse("unsuccesful")

(EDIT1) 第一个日历初始化代码

function initializeCalendar(){

        $('#calendar').fullCalendar({
        header: {
          left: 'prev,next today',
          center: 'title',
          right: 'month,agendaWeek,agendaDay,listWeek'
        },
        defaultDate: today,
        navLinks: true,
        editable: true,
        eventLimit: true,
        selectable: true,
        events: [{
            title: 'Simple static event',
            start: '2018-11-16',
            description: 'Super cool event'
          },

        ],
        customButtons: { addEventButton: { text: 'Add Event', class:'AddEventPopup_open', click: function() { 
            return true;
         }} 
        },
        footer: {left: ' ', center: 'addEventButton', right: ' ' 
        },


      });

    }

【问题讨论】:

  • 我发现这个问题与我的问题非常相关,但是我不太清楚在我的特定情况下该怎么做。 stackoverflow.com/questions/16062899/…
  • 能否也添加第一个日历初始化代码
  • 刚刚添加了第一个日历的初始化代码。我曾尝试联系MDB,看看他们是否可以提供一些线索,但没有得到他们的任何帮助。该问题似乎与事件处理程序绑定有关,但我仍然没有找到适合我的情况的解决方案。
  • @LawrenceDeSouza 可以添加执行AJAX请求的点击触发代码吗?您将该代码放在哪个事件处理程序上以及如何放置?
  • 解决了这个问题。只需要在关闭时销毁覆盖层中的日历插件。我刚刚收到回复,最后是来自制作插件的公司。我讨厌那些带有乱码的黑匣子插件,无法进行更改或查看任何内容。

标签: jquery django ajax


【解决方案1】:

我会尝试将 never_cache 装饰器添加到视图中:

from django.views.decorators.cache import never_cache


@login_required
@never_cache
def teacherDayAgenda(request):
    ...

见:

https://docs.djangoproject.com/en/3.0/topics/http/decorators/#caching

【讨论】:

    【解决方案2】:

    MDB 日历插件的解决方案是只销毁元素并在单击一天时再次运行代码。

    $('#calendar').fullCalendar('destroy');
    

    我还是决定改用免费的开源日历。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多