Django DetailView 更新在一个页面上不起作用 - NoReverseMatch 错误



>我在更新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 at/task/164/反转为"任务详细信息",未找到参数"(",("。尝试了 1 种模式:['任务\/(?P[0-9]+(\/$'] 请求方法:开机自检 请求网址:http://127.0.0.1:8000/task/164/姜戈版本:3.0.6 异常类型:无反向匹配 异常值:
反转为"任务详细信息",未找到参数"(",("。尝试了 1 种模式:['任务\/(?P[0-9]+(\/$'] 异常位置:/home/lukasz/envtest2/lib/python3.6/site-packages/django/urls/resolvers.py in _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>

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

正确的解决方法是尽可能坚持相同的视图体系结构,但一个微不足道的修复是:

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

相关内容

最新更新