Обновление Django DetailView на одной странице не работает - ошибка NoReverseMatch

У меня проблема с обновлением моего DetailView, поэтому, когда я пытаюсь отправить обновленные значения, я получаю сообщение об ошибке NoReverseMatch в /task/164/. Не могли бы вы подсказать, что не так?

Спасибо!

URL:

path('excel_upload', ex_views.ExcelUploadView.as_view(), name='excel-upload'),
path('user_list', ex_views.UsersListView.as_view(), name = "user-list"),
path('excel_table', ex_views.ExcelTableView.as_view(), name = "excel-table"),
path("task/add", ex_views.TaskAddView.as_view(), name="task-add"),
path("task/<int:pk>/", ex_views.TaskDetailView.as_view(), name="task-detail"),

формы.py

class AddEditTaskForm(forms.ModelForm):

class Meta:
    model = Task
    exclude = ['created_by']
    widgets = {
        "due_date": forms.DateInput(attrs={'type':'date'}),
        "completed_date": forms.DateInput(attrs={'type': 'date'}),
        "name":forms.TextInput(),
        "note": forms.Textarea(),
    }

просмотры.py

class TaskDetailView(DetailView):
model = Task
template_name = "hana/task_detail.html"

# Add POST method
def post(self, request, pk):
    task = get_object_or_404(Task, pk=pk)
    form = AddEditTaskForm(request.POST, instance=task)
    if "add_edit_task" in request.POST:
        if form.is_valid():
            form.save()
            messages.success(request, "The task has been edited.")
            return redirect('excel-table')
    return render(request, 'hana/task_detail.html', {'form': form})

ошибка:

NoReverseMatch в /task/164/ Реверс для 'детали задачи' с аргументами '('',)' не найден. Пробовали 1 шаблон(ы): ['task\/(?P[0-9]+)\/$'] Метод запроса: URL запроса POST: http://127.0.0.1:8000/task/164/ Версия Django: 3.0.6 Тип исключения: NoReverseMatch Значение исключения:
Обратное для 'task -detail' с аргументами '('',)' не найден. Пробовали 1 шаблон(ы): ['task\/(?P[0-9]+)\/$'] Местоположение исключения: /home/lukasz/envtest2/lib/python3.6/site-packages/django/urls /resolvers.py в _reverse_with_prefix, строка 677

шаблон:

<form method="post" action="{% url 'task-detail' object.id %}" role="form" class="d-inline">
                    {% csrf_token %}
                    <div style="display:inline;">
                        <button class="btn btn-info btn-sm" type="submit" name="toggle_done">
                            {% if task.completed %} Mark Not Done {% else %} Mark Done {% endif %}
                        </button>
                    </div>
                </form>
                <a class="btn btn-danger btn-sm mt-1 mb-1" href={% url 'task-delete' object.id %}">Delete</a>

person Lukasz Staszak    schedule 03.07.2020    source источник
comment
Я забыл представить свою кнопку отправки в шаблоне: ‹p› ‹input type=submit name=add_edit_task value=Submit class=btn btn-primary› ‹/p›   -  person Lukasz Staszak    schedule 03.07.2020
comment
Ошибка в вашем task_detail.html. Пожалуйста, отредактируйте свой вопрос и опубликуйте источник для этого шаблона.   -  person Selcuk    schedule 03.07.2020
comment
Я добавил часть, которая наверняка проблематична. Есть 2 кнопки, которые запускают дополнительные функции, и я передаю туда object.id. Как только я сделал первое действие пустым, проблема была со вторым, т.е. задачей-удалить btn. Итак, как я могу сохранить эти кнопки в своем шаблоне и не иметь ошибки обратного совпадения?   -  person Lukasz Staszak    schedule 03.07.2020


Ответы (1)


Ваша проблема вызвана смешиванием представлений на основе классов и функций. Представление post, основанное на функции, использует тот же шаблон, что и представление TaskDetailView, основанное на классе, но, поскольку оно не имеет той же магии, унаследованной от DetailView, в словаре контекста не передается object (вы передаете только form).

Правильным решением было бы по возможности придерживаться одной и той же архитектуры представления, но тривиальным решением было бы:

return render(request, 'hana/task_detail.html', {'form': form, 'object': task})
person Selcuk    schedule 03.07.2020
comment
Привет Selcuk, большое спасибо за подсказку. Во-первых, я сделал простое исправление, добавив объект в контекст, и он сделал так, что я не вижу ошибки, но скорректированные данные не сохраняются в базе данных. Я бы попытался перестроить его в общие представления классов и получить объект контекста. Надеялся, что поможет/.. BR Lukasz - person Lukasz Staszak; 03.07.2020