Javascript 在Django中使用ajax保存数据是行不通的

Javascript 在Django中使用ajax保存数据是行不通的,javascript,jquery,python,ajax,django,Javascript,Jquery,Python,Ajax,Django,我正在尝试使用jquery$.ajax将javascript中的数据保存到django视图,但浏览器控制台将显示以下错误: 这是我的javascript内容,其中包含$。ajax: var url = $(this).attr('action'); $.ajax({ type: 'POST', url : url, dataType : 'json', data:{ firstname : $('#firstnam

我正在尝试使用
jquery$.ajax
javascript
中的数据保存到
django视图
,但浏览器控制台将显示以下错误:

这是我的
javascript
内容,其中包含
$。ajax

var url = $(this).attr('action');

     $.ajax({
     type: 'POST',
     url : url,
     dataType    : 'json',
     data:{
        firstname   :   $('#firstname').val(),
        lastname    :   $('#lastname').val(),
        gender      :   $('#gender').val(),
        birthdate   :   $('#bdate').val(),
        age         :   $('#age').val(),
        address     :   $('#address').val(),
        mobile_no   :   $('#mobile').val(),
        home_no     :   $('#home').val(),
        email       :   $('#email').val(),
        csrfmiddlewaretoken     :   $('input[name=csrfmiddlewaretoken]').val(),
     },
     success:function(data){
        $('.bvc-emp-list-item-result').html(data)
     },
});
这是我的
视图。py

def create_employee(request):
    if request.method == 'POST':
        firstname = request.POST['firstname']
        lastname = request.POST['lastname']
        gender = request.POST['gender']
        bdate = request.POST['bdate']
        age = request.POST['age']
        address = request.POST['address']
        home_no = request.POST['home_no']
        mobile_no = request.POST['mobile_no']
        email = request.POST['email']

        Employee.objects.create(
            firstname = firstname,
            lastname = lastname,
            gender = gender,
            bdate = bdate,
            age = age,
            address = address,
            mobile_no = mobile_no,
            home_no = home_no,
            email = email
        )

        # Get all employee from db.
        employees = Employee.objects.all()

        return render_to_response(
            'payroll/employee/employee-list-item.html', # template
            {'employees' : employees }, # context
            context_instance=RequestContext(request) # request
        )
如果你想查看我的
url.py
,在这里

from django.conf.urls import url
from . import views

app_name = 'payroll'
urlpatterns = [
    # ex: /payroll/employee/create/
    url(r'^employee/create/$', views.create_employee, name='create_employee')
]
我是WebDev新手,Django请帮助

更新 控制台日志生成
POST
错误,现在添加了一个
XHR已完成加载:POST”http://127.0.0.1:8000/payroll/employee/create/“

现在,
cmd
生成此回溯

Internal Server Error: /payroll/employee/create/
Traceback (most recent call last):
  File "C:\Users\Web\Desktop\PyDev\projects\bvc_env\lib\site-packages\django\utils\datastructures.py", line 83, in __getitem__
    list_ = super(MultiValueDict, self).__getitem__(key)
KeyError: 'bdate'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Web\Desktop\PyDev\projects\bvc_env\lib\site-packages\django\core\handlers\base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Web\Desktop\PyDev\projects\bvc_env\lib\site-packages\django\core\handlers\base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Web\Desktop\PyDev\projects\bvc_env\src\payroll\views.py", line 21, in create_employee
    bdate = request.POST['bdate']
  File "C:\Users\Web\Desktop\PyDev\projects\bvc_env\lib\site-packages\django\utils\datastructures.py", line 85, in __getitem__
    raise MultiValueDictKeyError(repr(key))
django.utils.datastructures.MultiValueDictKeyError: "'bdate'"
[20/Jul/2016 13:10:35] "POST /payroll/employee/create/ HTTP/1.1" 500 18952

首先,您必须在Ajax请求调用中传递csrf令牌,请参见


否则,它将不允许您进行POST请求,它将作为GET请求,并且您的全部数据将以
request.GET
而不是request.POST的形式出现。因此,请尝试打印
request.data
request.post
,并根据使用
request.data['firstname']
request.post['firstname']

根据@solarismoke>的建议,我将
请求更改为
request.post['bdate']
因为在js文件中,变量是
生日
而不是
bdate

然后,当我开始进行日期解析时,Django跟踪告诉我以下错误:

ValueError:时间数据“1989年11月28日”与格式不匹配
%Y-%m-%d”

所以我用这一行修改了代码,根据:


现在最后一个问题是
render_to_response
函数,因为在中,不建议使用该函数,而且将来可能会被弃用。我使用的是最新版本
django 1.9

return render_to_response(
            'payroll/employee/employee-list-item.html', # template
            {'employees' : employees }, # context
            context_instance=RequestContext(request) # request
        )
我将其替换为以下代码:

return render(request,
            'payroll/employee/employee-list-item.html', 
            {'employees' : employees }
        )
在js文件中,我将数据类型值替换为
html


它现在工作正常。

500错误意味着Django遇到了错误。检查控制台/错误日志以了解错误原因。通过查看,我可以看到您的代码中至少有一个错误-
Employee.object.create
应该是
Employee.objects.create
。我怀疑我的
js
文件中也有一个错误。您的js中的错误不会导致服务器响应500次。在任何情况下,您都需要一次修复一件事情…发布整个错误回溯,而不仅仅是最后的错误消息。它应该包含对导致错误的代码行的引用。您没有发布
bdate
字段。。。因此出现了错误。您正在发布一个
birthdate
字段,该字段可能是您需要在视图中获取的代码:
bdate=request.POST['birthdate']
return render(request,
            'payroll/employee/employee-list-item.html', 
            {'employees' : employees }
        )