#python #django
#python #django
Вопрос:
почему мой код показывает эту ошибку, поскольку весь мой код правильный?
объект ‘list’ не имеет атрибута ‘_meta’
views.py
from django.shortcuts import render, redirect, get_list_or_404
from .models import Task
from .forms import TaskForm
def update_task(request, pk):
up_task = get_list_or_404(Task, id=pk)
if request.method == 'POST':
up_form = TaskForm(request.POST, instance=up_task)
if up_form.is_valid():
up_form.save()
return redirect('tasks')
else:
up_form = TaskForm(instance=up_task)
context = {
'update_task_form': up_form
}
return render(request, 'task/update_task.html', context)
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.tasks, name='tasks'),
path('task/<str:pk>/update/', views.update_task, name='update_task'),
]
Ошибка
Внутренняя ошибка сервера: /task/3/update/
Трассировка (последний последний вызов):
Файл «C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangocorehandlersexception.py «, строка 47, во внутреннем ответе = get_response(запрос) Файл «C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangocorehandlersbase.py «, строка 179, в файле _get_response response = wrapped_callback(запрос, *callback_args, **callback_kwargs) «C:UsersRoyalPycharmProjecttodoapptodoapptaskviews.py «, строка 31, в файле update_task up_form = TaskForm(экземпляр = up_task) «C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangoformsmodels.py «, строка 294, в init object_data = model_to_dict(экземпляр, выбирает.поля, варианты.исключить) Файл «C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangoformsmodels.py «, строка 85, в model_to_dict выбирает = экземпляр.ошибка атрибута _meta: объект ‘list’ не имеет атрибута ‘_meta’ [04 / Oct / 2020 09:06:27] «GET /task/3 / update/ HTTP/1.1» 500 71974 Внутренняя ошибка сервера: /task/3/ update/ Traceback (последний последний вызов): Файл»C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangocorehandlersexception.py «, строка 47, во внутреннем ответе = get_response(запрос) Файл «C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangocorehandlersbase.py «, строка 179, в файле _get_response response = wrapped_callback(запрос, *callback_args, **callback_kwargs) «C:UsersRoyalPycharmProjecttodoapptodoapptaskviews.py «, строка 31, в файле update_task up_form = TaskForm(экземпляр = up_task) «C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangoformsmodels.py «, строка 294, в init object_data = model_to_dict(экземпляр, выбирает.поля, варианты.исключить) Файл «C:UsersRoyalAppDataRoamingPythonPython38site-packagesdjangoformsmodels.py «, строка 85, в model_to_dict выбирает = экземпляр.ошибка атрибута _meta: объект ‘list’ не имеет атрибута ‘_meta’
Ответ №1:
Используйте get_object_or_404
—(Django doc) вместо get_list_or_404
from django.shortcuts import get_object_or_404
# and in your view
up_task = get_object_or_404(Task, id=pk)
Обновить
Обновите свой шаблон следующим образом,
<form action="{% url 'tasks' %}" method="POST">
{% csrf_token %}
{{ update_task_form }}
</form>
<a type="submit" href="">Update</a>
Комментарии:
1. Обратный для ‘update_task’ с аргументами ‘(«,)’ не найден. попробовано 1 шаблон (ы): [‘task/(?P<pk>[^/] )/update/ $’]
2. это мой шаблон
3. <действие формы=»{% url ‘update_task’ update_task_form.id %}» метод=»ОПУБЛИКОВАТЬ»> {% csrf_token %} {{ update_task_form }} </form> <a тип=»отправить» href=»»> Обновить</a>
4. он работал, но не обновлялся. означает, что нет ссылки для обновления формы