【问题标题】:Django DetailView update on one page not working - NoReverseMatch error一页上的 Django DetailView 更新不起作用 - NoReverseMatch 错误
【发布时间】:2020-10-23 15:52:39
【问题描述】:

我在更新 DetailView 时遇到问题,因此一旦我尝试提交更新的值,我就会在 /task/164/ 处收到错误 NoReverseMatch。你能告诉我有什么问题吗?

谢谢!

网址:

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"),

forms.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(),
    }

views.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]+)\/$'] 请求方法:POST 请求网址:http://127.0.0.1:8000/task/164/ Django 版本:3.0.6 异常类型:NoReverseMatch 异常值:
未找到带有参数“(”,)“的“任务详细信息”的反向。尝试了 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>

【问题讨论】:

  • 我忘记在模板中显示我的提交按钮:

  • 错误在您的task_detail.html 中。请编辑您的问题并发布该模板的来源。
  • 我已经添加了肯定有问题的部分。有 2 个 btns 正在触发附加功能,我正在那里传递一个 object.id。一旦我将第一个操作设为空,问题就出在第二个操作上,即任务删除 btn。那么如何将这些 btns 保留在我的模板中并且不会出现反向匹配错误?

标签: django detailview


【解决方案1】:

您的问题是由基于类和基于函数的视图混合引起的。基于函数的post 视图使用与基于类的TaskDetailView 相同的模板,但由于它没有从DetailView 继承的相同“魔力”,因此上下文字典中没有传递object(您只通过form)。

适当的解决方法是尽可能坚持使用相同的视图架构,但微不足道的解决方法是:

return render(request, 'hana/task_detail.html', {'form': form, 'object': task})

【讨论】:

  • 嗨,塞尔丘克,非常感谢您的提示。首先,我通过将对象添加到上下文中进行了简单的修复,并且它以我没有看到错误但调整后的数据未存储在数据库中的方式进行。我会尝试将其重建为通用类视图并获取上下文对象。希望它会有所帮助/.. BR Lukasz
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 2021-01-15
  • 2015-10-24
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多