Я пытаюсь сохранить данные из javascript
в django-views
используя jquery $.ajax
но консоль браузера даст мне эту ошибку:
Вот мой контент 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)
},
});
И вот мои views.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
)
Если вы хотите проверить мои urls.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 finished loading: 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
В соответствии с предложением @solarissmoke я изменил request.POST['bdate']
чтобы request.POST['bdate']
request.POST['birthdate']
поскольку в файле js переменная - birthdate
не bdate
Затем, когда я начал работать для синтаксического анализа трассировки Django, дайте мне эту ошибку:
ValueError: time data 'November 28, 1989' does not match format
"%Y-%m-%d'
Поэтому я изменил код с помощью этой строки в соответствии с документацией формата даты python:
bdate = datetime.datetime.strptime(request.POST['birthdate'], "%B %d, %Y")
Теперь последней проблемой является функция render_to_response
потому что в документации Django она не рекомендуется и, вероятно, будет устаревать в будущем, я использую последнюю версию 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
Теперь он отлично работает.
Прежде всего, вам нужно передать токен csrf в вызове запроса Ajax, см. Это
В противном случае он не позволит вам запросить POST, который он запросит как GET, и все ваши данные будут поступать в request.GET
вместо request.POST. Поэтому сделайте это, попробуйте распечатать request.data
и request.post
и проверьте, где находятся ваши данные, в соответствии с этим используйте request.data['firstname']
и request.POST['firstname']
.
Employee.object.create
должно бытьEmployee.objects.create
.js
также есть ошибка