使用Django表单和手动设置日期字段有什么区别?

时间:2019-02-11 03:42:18

标签: django

我正在从ajax到Django获取日期/时间信息。我正在使用2种不同的观点。 event_edit工作正常,但是event_edit_new不工作。它返回错误Enter a valid date/time.

我的问题是有什么不同。他们正在获得完全相同的信息,但是一个可以,而另一个则不能。

发出ajax请求的Javascript代码:

var ajax_test = function(event){

    $.ajax({
      url: '/scheduler/event/' + event.eventId + '/edit2/',
      method: 'POST', // 'POST' or 'PUT'
      data: {
        'Note': event.title,
        'OpNum': event.resourceId,
        'StartTime' : event.start.format(),
        'StopTime' : event.end.format(),
        'ScheduleNum': event.eventId,

      }
    }).done(function(res) {
      console.log("done", res)


    }).fail(function(error) {
      console.error("error", error)
      console.log(event.start.format());
    });
  }

2次观看

def event_edit(request, pk):
    schedule = get_object_or_404(Schedule, pk=pk)

    schedule.OpNum = request.POST.get('OpNum')
    schedule.Note = request.POST.get('Note')
    schedule.StartTime = request.POST.get('StartTime')
    schedule.StopTime = request.POST.get('StopTime')
    schedule.ScheduleNum =request.POST.get('ScheduleNum')
    schedule.save()

    return HttpResponse('ok')


def event_edit_new(request, pk):

    schedule = get_object_or_404(Schedule, pk=pk)

    if request.method =='POST':
        form = ScheduleForm(request.POST, request.FILES, instance = schedule)

        if form.is_valid():
            form.save()          
            return HttpResponse('ok')
        else:
            return HttpResponse('error')
    else:
        return HttpResponse('done')

1 个答案:

答案 0 :(得分:1)

在您的第一个视图中,没有验证适用于用户数据输入:

schedule.StartTime = request.POST.get('StartTime')
schedule.StopTime = request.POST.get('StopTime')

request.POST不会验证任何数据,因此将完全按照提交的方式抓取用户数据并将其设置在模型上。请注意,它可能会起作用,但如果用户将发送应用程序无法理解的日期时间格式,则不能保证它会起作用。例如,尝试提交类似"invalid date"之类的内容,您会得到500错误。

另一方面,您的第二个视图使用Django Form来验证用户输入。通过使用表单,您可以在以任何方式处理用户输入之前对其进行验证。您没有粘贴表单的结构,但是如果获取Enter a valid date/time.,则意味着Django表单未验证datetime字段之一。造成这种情况的原因有几个:

  • 提交的日期时间不是DateTimeField的{​​{3}}之一。您可以使用以下方式自定义格式:
class MyForm(forms.Form):
    datetime_field = forms.DateTimeField(input_formats=['%Y-%m-%dT%H:%M:%SZ', ...])
  • 提交的日期时间不是Django默认支持的日期时间格式之一。 您可以使用input_formats设置来自定义它们。