Slakky
Slakky

Reputation: 13

NoReverseMatch Django: can't find pattern

I'm building my first application (guess app) with Django, I've been doing well so far. But I've encountered an error when trying to redirect to a Detail View when a user submits a file through a submit function (similar to a 'post blog' scenario).

I've looked up several posts with the same problem and I can not figure out why my code is not working.

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'

I know I'm mixing class based views with function based views, but for some reason I can not get my submit function to work when I try to implement it as a class based view. Anyway, I think that shouldn't be a problem

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 %}

I'd expect a redirect to the detail view of the object that has been created with the submit function and submitfileform (model form). I can access the details if I just type /result/ and the primary key of any created object. But apparently I can't do the same through a redirect.

The error I am getting:

NoReverseMatch at /submit/
Reverse for 'result-detail' with no arguments not found. 1 pattern(s) tried: ['result/(?P<pk>[0-9]+)$'] 

Upvotes: 1

Views: 57

Answers (1)

ruddra
ruddra

Reputation: 51988

In your code, you have two problems. First, form is not a Model instance. When you call form.save(), it will return the model instance. So you need to store it in a variable. Second problem is that, you need to pass the kwargs as a known argument in the reverse, not in HttpResponseRedirect. So the following code should work:

instance = form.save()
return HttpResponseRedirect(reverse('result-detail',kwargs={'pk': instance.pk}))

Upvotes: 1

Related Questions