объект ‘list’ не имеет атрибута ‘_meta’

#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. он работал, но не обновлялся. означает, что нет ссылки для обновления формы