MultiValueKeyDictError Django при загрузке CSV-файла - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь загрузить CSV-файл от пользователя и отобразить его в шаблоне. Я много искал ошибки, но никто не помог. Поэтому я решил воспользоваться помощью этого великого сообщества. Вот мой код

views.py

@csrf_exempt
def offlineResults(request):
    screenNametestList = []
    friendsCountList = []
    followersCountList = []
    favouriteCountList = []
    listedCountList = []
    statusCountList = []
    genEnabledList = []
    protectedList = []
    verifiedList = []
    defaultProfileList = []
    botsList = []

    if request.method == 'POST' and request.FILES['filecsv']:
        csv_file = request.FILES['filecsv']
        data_set = csv_file.read().decode('UTF-8')
        io_string = io.StringIO(data_set)
        next(io_string)  # skipping 1st line because 1st line contains header file
        for column in csv.reader(io_string, delimiter=','):
            screenNametest = column[0]
            screenNametestList.append(screenNametest)
            friends_countTest = column[1]
            friendsCountList.append(friends_countTest)
            followers_countTest = column[2]
            followersCountList.append(followers_countTest)
            favouriteCountTest = column[3]
            favouriteCountList.append(favouriteCountTest)
            listedCountTest = column[4]
            listedCountList.append(listedCountTest)
            statusCountTest = column[5]
            statusCountList.append(statusCountTest)
            geoEnabledTest = column[6]
            genEnabledList.append(geoEnabledTest)
            protectedTest = column[7]
            protectedList.append(protectedTest)
            verifiedTest = column[8]
            verifiedList.append(verifiedTest)
            defaultProfileTest = column[9]
            defaultProfileList.append(defaultProfileTest)
            botsTest = column[10]
            botsList.append(botsTest)

        dicCSV = {
            'sc': screenNametestList,
            'friendCount': friendsCountList,
            'followersCount': followersCountList,
            'favouriteCount': favouriteCountList,
            'listedCount': listedCountList,
            'statusCount': statusCountList,
            'geoEnabled': genEnabledList,
            'protected': protectedList,
            'verified': verifiedList,
            'defaultProfile': defaultProfileList,
            'bots': botsList
        }

        return JsonResponse(dicCSV)

offline.html

<div class="container">
        <h1 class="text-center"><b><u>Offline Results</u></b></h1>
        <form class="md-form mt-4" method="post" enctype="multipart/form-data">
            <div class="file-field">

                <input type="file" name="filecsv" accept=".csv">

                <button type="submit" id="load_csv" class="btn btn-default">Submit</button>
            </div>
        </form>

        <div class="table-responsive mt-4">
            <table class="table" id="data_table">
                <thead>
                <tr>
                    <th scope="col">ScreenName</th>
                    <th scope="col">FriendCount</th>
                    <th scope="col">FollowerCount</th>
                    <th scope="col">FavouriteCount</th>
                    <th scope="col">listedCount</th>
                    <th scope="col">statusCount</th>
                    <th scope="col">geoEnabled</th>
                    <th scope="col">Protected</th>
                    <th scope="col">Verified</th>
                    <th scope="col">DefaultProfile</th>
                </tr>
                </thead>
            </table>
        </div>
    </div><!--end container-->

AJAX часть

$(document).ready(function () {
        $('#load_csv').on('click',function (event) {
            event.preventDefault();
            $.ajax({
                url: {% url 'offlineResults' %},
                method: 'POST',
                dataType:'json',
                {#contentType: false,#}
                {#cache: false,#}
                {#processData: false,#}
                success: function (jsonData)
                {
                    $('#load_csv').val('');
                    $('#data_table').DataTable({
                        data : jsonData,
                        columns: [
                            {   data:   'sc'},
                            {   data:   'friendCount'},
                            {   data:   'followersCount'},
                            {   data:   'favouriteCount'},
                            {   data:   'listedCount'},
                            {   data:   'statusCount'},
                            {   data:   'geoEnabled'},
                            {   data:   'protected'},
                            {   data:   'verified'},
                            {   data:   'defaultProfile'}

                        ]
                    });
                }
            })
        });

    });

Генерирует следующую ошибку

django.utils.datastructures.MultiValueDictKeyError: 'filecsv' [11 / Apr / 2019 20:41:48] "POST / offlineResults / HTTP / 1.1" 500 17525

Что я делаю не так. Помогите пожалуйста

Весь трассировщик

Внутренняя ошибка сервера: / offlineResults / Traceback (последний вызов последний): файл "C: \ Users \ Mustajab \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ сайта-пакеты \ Джанго \ Utils \ datastructures.py", строка 77, в getitem list_ = super (). getitem (ключ) KeyError: 'filecsv'

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): File "C: \ Users \ Mustajab \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ сайта-пакеты \ Джанго \ ядро ​​\ обработчики \ exception.py", строка 34, во внутренней response = get_response (запрос) Файл "C: \ Users \ Mustajab \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ base.py", строка 126 в _get_response response = self.process_exception_by_middleware (e, запрос) Файл "C: \ Users \ Mustajab \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ base.py", строка 124 в _get_response response = wrapped_callback (request, * callback_args, ** callback_kwargs) Файл "C: \ Users \ Mustajab \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ views \ decorators \ csrf.py" , строка 54, в wrapped_view return view_func (* args, ** kwargs) Файл "F: \ Final Year Project \ FYPDjango \ FYPapp \ views.py", строка 64, в offlineResults if request.method == 'POST' и request.FILES ['filecsv']: файл "C: \ Users \ Mustajab \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ utils \ datastructures.py», строка 79, в getitem поднять MultiValueDictKeyError (key) django.utils.datastructures.MultiValueDictKeyError: 'filecsv' [11 / Apr / 2019 20:41:48] "POST / offlineResults / HTTP / 1.1" 500 17525

1 Ответ

0 голосов
/ 11 апреля 2019

Ошибка в том, что вы обращаетесь к ключу, которого нет в словаре. Когда вы проверяете, существует ли значение в словаре, как вы это делаете в if request.FILES[‘filecsv’], вы должны использовать get() вместо нижнего индекса ([]), чтобы избежать KeyError. Итак:

if request.FILES.get('filecsv')

Как только вы измените это, вы заметите, что условие if равно False, и вы получите еще одну ошибку, потому что ваше представление ничего не возвращает в этом случае. Всегда возвращайте HttpResponse. Может быть, та же страница с сообщением об ошибке здесь.

Теперь основная проблема заключается в том, что ваш Ajax-вызов не передает никаких данных. Это просто делает запрос POST без каких-либо данных. Проверьте здесь как загрузить файл с помощью jquery ajax.

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