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>
После исправления все теперь работает так, как ожидалось.
Я искренне приношу извинения за возникшую путаницу и за потраченное впустую время. Я все еще новичок в этой области и активно учусь, поэтому искренне ценю терпение и поддержку каждого. Спасибо вам за вашу помощь!