我正在用Django构建我的第一个应用程序(猜测应用程序),到目前为止我做得很好。但是当用户通过Submit函数(类似于“ post blog”场景)提交文件时,尝试重定向到详细信息视图时遇到错误。
我查了几个有相同问题的帖子,但无法弄清楚为什么我的代码无法正常工作。
views.py
@login_required
def submit(request):
if request.method == 'POST':
submited_form = SubmitFileForm(request.POST, request.FILES)
if submited_form.is_valid():
...
form.save()
return HttpResponseRedirect(reverse('result-detail'), kwargs={'pk': form.pk})
else:
submited_form = SubmitFileForm()
return render(request, 'guess/submit.html', context)
class ResultDetailView(LoginRequiredMixin, DetailView):
model = Result
template_name = 'guess/result_detail.html'
context_object_name = 'result'
我知道我将基于类的视图与基于函数的视图混合在一起,但是由于某些原因,当我尝试将其实现为基于类的视图时,我的提交函数无法正常工作。无论如何,我认为应该没问题
urls.py
url_patterns = [
...
path('result/<int:pk>', guess_views.ResultDetailView.as_view(), name='result-detail'),
...
]
result_detail.html
{% extends "guess/base.html" %}
{% block content %}
<article class="media content-section">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2" href="#">{{ result.author }}</a>
<small class="text-muted">{{ result.date_posted }}</small>
</div>
<h2 class="article-title">{{ result.title }}</h2>
<p class="article-content">{{ result.statistic }}</p>
</div>
</article>
{% endblock content %}
我希望重定向到已使用Submit函数和Submitfileform(模型窗体)创建的对象的详细视图。如果我只键入/ result /和任何已创建对象的主键,则可以访问详细信息。但是显然我不能通过重定向来做同样的事情。
我得到的错误:
NoReverseMatch at /submit/
Reverse for 'result-detail' with no arguments not found. 1 pattern(s) tried: ['result/(?P<pk>[0-9]+)$']
答案 0 :(得分:1)
在您的代码中,您有两个问题。首先,表单不是Model实例。调用form.save()
时,它将返回模型实例。因此,您需要将其存储在变量中。第二个问题是,您需要将kwargs
作为已知参数传递给reverse,而不是HttpResponseRedirect
。因此,以下代码应该起作用:
instance = form.save()
return HttpResponseRedirect(reverse('result-detail',kwargs={'pk': instance.pk}))