MultiValueDictKeyError при получении данных, отправленных в форме с помощью Ajax в Django - PullRequest
0 голосов
/ 12 октября 2019

Я учусь веб-разработке на Django. Я только что узнал, как размещать данные в форме через AJAX. Теперь у меня возникли проблемы с возвратом результатов данных.

Ниже хорошо работает функция POST

def cat_select(request):
    cat_selected=[]
    if request.method=='POST': #raise MultiValueDictKeyError when GET in the browser due to vertical having multiple values
        cat_name=['l2','l3']
        cat_selected=[request.POST[x].split(',') for x in cat_name]
        print(cat_selected)
    else:
        cat_name=['l2','l3']
        cat_selected=[request.GET[x].split(',') for x in cat_name]
        cat_selected=get_result(["US"],cat_selected)
        print(cat_selected)
    return JsonResponse({'cat':cat_selected},safe=False)
<form id="cat_select">{% csrf_token %} 
<input class="site" name="site" type="text">
<input class="l2" name="l2" id="l2" type="text" style="width:30%">
<input class="l3" name="l3" id="l3" type="text" style="width:50%">
<br>
<button class="btn btn-outline-success my-2 my-sm-0" type="submit" id="cat_submit">Submit</button>
</form>
<script type="text/javascript">
$(document).on('submit','#cat_select',function(e){
    e.preventDefault();
    $.ajax({
        type:'POST',
        url:'/cat_select',
        data:{
            l2:$('#l2').val(),
            l3:$('#l3').val(),
            csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
        },
        success: function(){
            alert ("selected!")
        }
    });
});
</script>

Я попытался добавить ниже в $(document).on('submit','#cat_select',function(e){, но консоль напечатанаОшибка

    $.ajax({
                method:'GET',
                url:'/cat_select',
                success:function(data){
                    console.log(data);
                },
                error:function(data){
                    console.log('Error!');
                }
            });
Internal Server Error: /cat_select
Traceback (most recent call last):
  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\site-packages\django\utils\datastructures.py", line 78, in __getitem__
    list_ = super().__getitem__(key)
KeyError: 'l2'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Desktop\searchsite2\esearch\views.py", line 83, in cat_select
    cat_selected=[request.GET[x].split(',') for x in cat_name]
  File "C:\Users\Desktop\searchsite2\esearch\views.py", line 83, in <listcomp>
    cat_selected=[request.GET[x].split(',') for x in cat_name]
  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\site-packages\django\utils\datastructures.py", line 80, in __getitem__
    raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'l2'

Я до сих пор не совсем уверен, что послужило причиной MultiValueDictKeyError после прочтения других постов. Я выбрал два значения, но это было предназначено для множественного выбора.

Как я могу избавиться от этой ошибки? Спасибо.

1 Ответ

1 голос
/ 12 октября 2019

В запросе GET ajax вы не передаете 'l2' и 'l3', но ваше представление:

else:
    cat_name=['l2','l3']
    cat_selected=[request.GET[x].split(',') for x in cat_name]

Пытается получить доступ к ним обоим и, следовательно, к ошибке.

Передайте их обоих в запросе GET ajax, и ошибка исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...