Django MultiValueDictKeyError: „category“ When Submitting Form

Я работаю над приложением Django To-Do, и я пытаюсь реализовать функцию редактирования, где пользователи могут изменять категорию и важность задачи.

У меня есть шаблон edit.html, который содержит форму, и когда я отправляю ее, я получаю следующую ошибку:

django.utils.MultiValueDictKeyError: 'category'

Детали кода

edit.html (Шаблон с формой)

{% block content %}
<h2>Edit Task</h2>
<form action="{% url 'todo:edit' task.id %}" method="post">
    {% csrf_token %}
    <input
        type="text"
        name="category"
        value="{{ task.category }}"
    />
    <input
        type="text"
        name="importancy"
        value="{{ task.importancy }}"
    />
    <input type="submit" value="Edit">
</form>
{% endblock content %}

views.py

from django.shortcuts import render, redirect, get_object_or_404
from .models import Task

def edit(request, task_id):
    task = get_object_or_404(Task, id=task_id)

    if request.method == 'POST':
        print(request.POST)  # Debugging to check form data

        task.category = request.POST['category']  # This line causes the error
        task.importancy = request.POST['importancy']
        task.save()
        return redirect('todo:index')

    return render(request, 'todo/edit.html', {'task': task})

Я проверил свою форму, чтобы убедиться, что name="category" является правильным, и оно соответствует тому, к чему я пытаюсь получить доступ в request.POST. Дважды проверил метод формы, чтобы убедиться, что это POST, а не GET. Просмотрел URL-адреса на предмет того, не мешает ли там что-нибудь, но, похоже, все в порядке.

Файл django.utils.MultiValueDictKeyError ошибка возникает, когда мы пытаемся получить доступ к ключу в словаре, который не существует.

Попробуйте один из приведенных ниже вариантов, чтобы сначала проверить существует ключ или нет, если существует, то получите значение этого ключа.

task.category = request.POST.get('category', task.category)

ИЛИ

if 'category' in request.POST:
    task.category = request.POST['category']

Вместо прямого доступа к значению через ["category"] используйте get, чтобы при появлении отсутствующего значения возвращать значение None.
task.category = request.POST.get('category')

пожалуйста, обратитесь к этому

Проблема была в файле index.html , в частности, с кнопкой редактирования , которая перенаправляет на страницу редактирования. Проблема была вызвана тем, что для метода формы было установлено значение POST вместо GET,, что привело к неожиданному поведению.

index.html

{% block content %}
<form method="POST"> <!-- This should be GET -->`
    {% csrf_token %}
    <table border = 1>
        <thead>
            <th style="padding: 5px 10px;">Task</th>
            <th style="padding: 5px 10px;">Category</th>
            <th style="padding: 5px 10px;">Importancy</th>
            <th style="padding: 5px 10px;">Date added</th>
            
        </thead>
        <tbody>
            {% for task in tasks %}
            <tr>
                <td style="padding: 5px 10px;">{{ task.task_name }}</td>
                <td style="padding: 5px 10px;">{{ task.category }}</td>
                <td style="padding: 5px 10px;">{{ task.importancy }}</td>
                <td style="padding: 5px 10px;">{{ task.date_added }}</td>
                <td style="padding: 5px 10px;">
                    <button name='edit' type='submit' formaction= '{% url "todo:edit" task.id %}'>edit</button> 
                    <button >delete</button> 
                </td>
            </tr>
            {% endfor %}
            
        </tbody>
    </table>
</form>

После исправления все теперь работает так, как ожидалось.

Я искренне приношу извинения за возникшую путаницу и за потраченное впустую время. Я все еще новичок в этой области и активно учусь, поэтому искренне ценю терпение и поддержку каждого. Спасибо вам за вашу помощь!

Вернуться на верх