Сохранить данные с помощью ajax в Django не получится

-1

Я пытаюсь сохранить данные из 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
  • 2
    Ошибка 500 означает, что Django обнаружил ошибку. Проверьте консоль / журнал ошибок на предмет причины ошибки. Посмотрев на это, я вижу, по крайней мере, одну ошибку в вашем коде - Employee.object.create должно быть Employee.objects.create .
  • 0
    я подозревал, что в моем файле js также есть ошибка
Показать ещё 10 комментариев

2 ответа

0
Лучший ответ

В соответствии с предложением @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

Теперь он отлично работает.

0

Прежде всего, вам нужно передать токен csrf в вызове запроса Ajax, см. Это

В противном случае он не позволит вам запросить POST, который он запросит как GET, и все ваши данные будут поступать в request.GET вместо request.POST. Поэтому сделайте это, попробуйте распечатать request.data и request.post и проверьте, где находятся ваши данные, в соответствии с этим используйте request.data['firstname'] и request.POST['firstname'].

Ещё вопросы

Сообщество Overcoder
Наверх
Меню