【问题标题】:Why do I keep getting a NoReverse Error in Django 3.2为什么我在 Django 3.2 中不断收到 NoReverse 错误
【发布时间】:2021-04-25 23:52:31
【问题描述】:

我知道这个问题已经被问过了,但没有一个解决方案是针对我正在使用的 Django 版本的,即 3.2。所以我正在关注 Django 教程,但我收到了这个错误。我在 Django 中使用通用视图,就像教程一样。在使用通用视图之前,一切正常。我必须硬编码我的视图还是我错误地实现了通用视图?

Internal Server Error: /polls/
Traceback (most recent call last):
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\core\handlers\base.py", line 204, in _get_response
    response = response.render()
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\response.py", line 105, in render
    self.content = self.rendered_content
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\base.py", line 170, in render
    return self._render(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\template\defaulttags.py", line 446, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\urls\base.py", line 86, in reverse
    return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
  File "C:\Users\miche\tutorial-env\lib\site-packages\django\urls\resolvers.py", line 694, in _reverse_with_prefix
    raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'detail' with arguments '(1,)' not found. 1 pattern(s) tried: ['polls/<int:pk/$']
[25/Apr/2021 17:05:11] "GET /polls/ HTTP/1.1" 500 133372
Not Found: /polls/1/
[25/Apr/2021 17:33:23] "GET /polls/1/ HTTP/1.1" 404 2715

这是我的代码: urls.py

from django.urls import path
from . import views

app_name = "polls"
urlpatterns = [
    path("", views.IndexView.as_view(), name="index"),
    path("<int:pk/", views.DetailView.as_view(), name="detail"),
    path("<int:pk/results/", views.ResultsView.as_view(), name="results"),
    path("<int:question_id>/vote/", views.vote, name="vote" ),
]

views.py

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic

from .models import Choice, Question
# Create your views here.
class IndexView(generic.ListView):
    template_name = "polls/index.html"
    context_object_name = "latest_question_list"

    def get_queryset(self):
        return Question.objects.order_by("-pub_date")[:5]

class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, "polls/detail.html", 
            {"question": question,
            "error_message": "You didn't select a choice",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()   
        return HttpResponseRedirect(reverse("polls:results", args=
        (question.id,))) 

index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

【问题讨论】:

    标签: python python-3.x django


    【解决方案1】:

    在 urls.py 中,您缺少捕获参数所需的右括号:

    path("<int:pk/", views.DetailView.as_view(), name="detail"),
    

    必须改为:

    path("<int:pk>/", views.DetailView.as_view(), name="detail"),
    

    这适用于 urls 文件中的“详细信息”和“结果”视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多