NoReverseMatch at / 模板渲染期间出错

Posted

技术标签:

【中文标题】NoReverseMatch at / 模板渲染期间出错【英文标题】:NoReverseMatch at / Error during template rendering 【发布时间】:2020-06-08 21:56:33 【问题描述】:

当我打开http://127.0.0.1:8000/home.html 时,我得到:

NoReverseMatch at / 和 Reverse for 'exam-detail' with arguments '('',)' 未找到。尝试了 1 种模式:['exam/(?P[^/]+)$']

我认为错误是由于urls.py 中的<str:pk> 造成的。

urls.py 文件如下:


from . import views
from .views import ExamListView, ExamDetailView

app_name='map'
urlpatterns = [
    path("", ExamListView.as_view(), name='map-home'),
    path("exam/<str:pk>", ExamDetailView.as_view(), name="exam-detail"),
    path("login_student/", views.login_student, name='map-login'),
    path("register_student", views.register_student, name='map-register'),
    path('add_student/', views.add_student, name='add_student'),
    path('front/', views.front, name="front"),
]

models.py

    subject = models.TextField(primary_key = True, unique = True)

    def __str__(self):
        return self.subject

home.html

% extends "map/base.html" %
% block content %
    <p>WELCOME HOME</p>
    % for exam in exams %
        <article class="media content-section">
            <div class="media-body">
                <div class="article-metadata">
                    <a class="mr-2" href="% url 'map:exam-detail' exam.subject %"> exam  </a>
                </div>
            </div>
        </article>
    % endfor %
% endblock content %

base.html

% load static %
<!DOCTYPE html>
<html>
<head>
     <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

<link rel="stylesheet" type="text/css" href="% static 'map/main.css' %">

    % if title %
        <title> title </title>
    % else %
        <title> MAP PAGE </title>
    % endif % 
</head>
<body>
        <header class="site-header">
      <nav class="navbar navbar-expand-md navbar-dark bg-steel fixed-top">
        <div class="container">
          <a class="navbar-brand mr-4" href="/">Project M.A.P</a>
          <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggle" aria-controls="navbarToggle" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarToggle">
            <div class="navbar-nav mr-auto">
              <a class="nav-item nav-link" href="% url 'map:map-home' %">Home</a>  <!-- no hardcoded links -->
              <a class="nav-item nav-link" href="% url 'map:map-home' %">About</a>
            </div>
            <!-- Navbar Right Side -->
            <div class="navbar-nav">
              % if user.is_authenticated %
                  <a class="nav-item nav-link" href="% url 'profile' %">Profile</a>
                  <a class="nav-item nav-link" href="% url 'logout' %">Logout</a>
              % else %
              <a class="nav-item nav-link" href="% url 'login' %">Login</a>
              <a class="nav-item nav-link" href="% url 'register' %">Register</a>
              <a class="nav-item nav-link" href="% url 'map:map-register' %">Student</a>
              % endif %
            </div>
          </div>
        </div>
      </nav>
    </header>
    <main role="main" class="container">
      <div class="row">
        <div class="col-md-8">
            % if messages %
                % for message in messages %
                    <div class="alert alert- message.tags ">
                         message 
                    </div>
                % endfor %
            % endif %
          % block content %% endblock %

        </div>
        <div class="col-md-4">
          <div class="content-section">
            <h3>Our Sidebar</h3>
            <p class='text-muted'>You can put any information here you'd like.
              <ul class="list-group">
                <li class="list-group-item list-group-item-light">Latest Posts</li>
                <li class="list-group-item list-group-item-light">Announcements</li>
                <li class="list-group-item list-group-item-light">Calendars</li>
                <li class="list-group-item list-group-item-light">etc</li>
              </ul>
            </p>
          </div>
        </div>
      </div>
    </main>


     <!-- Optional javascript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>

</body>
</html>[enter image description here][1]

views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.urls import reverse

from . models import Student, Exam
from django.views.generic import ListView, DetailView

def home(request):
    context = 
        'exams': Exam.objects.all()
    
    return render(request, 'map/home.html', context)

class ExamListView(ListView): #class based views
    model = Exam
    template_name = 'map/home.html'  #<app>/<model>_<viewtype>.html
    context_object_name = 'exams'
    ordering = ['subject'] #['-exam']


class ExamDetailView(DetailView):
    model = Exam

【问题讨论】:

网址exam-detail 未找到。请将此 URL 添加到 urls.py 中,或者如果这无效,请检查进行此调用的代码 请在下面的 url 中尝试,看看它是否能解决您的问题。 path("/", ExamDetailView.as_view(), name="exam-detail"), 未找到带有参数“('',)' 的“exam-detail”的反向操作。尝试了 1 种模式:['(?P[^/]+)$'] 这是我的错误。我也试过 path("/", ExamDetailView.as_view(), name="exam-detail") 。问题是由于参数传递不当造成的。但我不知道如何解决它。 【参考方案1】:

你错过了 home.html 中的exam.pk 以这种方式更新您的代码,

<div class="article-metadata">
<a class="mr-2" href="% url 'map:exam-detail' 
exam.pk %"> exam  </a>
 </div>
 </div>

【讨论】:

我试过这个。仍然得到同样的错误。 NoReverseMatch at / Reverse for 'exam-detail' with arguments '('',)' 未找到。尝试了 1 种模式:['exam/(?P[^/]+)/$'] 请求方法:GET 请求 URL:127.0.0.1:8000 Django 版本:3.0.3 异常类型:NoReverseMatch 异常值:未找到带有参数“(”,)”的“考试详细信息”的反向。尝试了 1 种模式:['exam/(?P[^/]+)/$'] 异常位置:C:\ProgramData\Anaconda3\lib\site-packages\django\urls\resolvers.py在 _reverse_with_prefix,第 677 行 在你的views.py文件中你创建了一个ExamDetailView类,你可以看到你的这个类只在模型字段上工作,没有template_name字段。您甚至为 DetailView 创建了 html 或模板文件吗?另外我建议你使用reverse_lazy。您可以查看我的views.py文件以了解其完成方式,链接-> github.com/YashMarmat/Blog-App-django-v3/blob/master/blog/…【参考方案2】:

在 python manage.py shell

from my_app_name.models import Exam

exam = Exam()
exam.subject = ""
exam.save()

我已经执行了这些行。我还为“google”、“english”等主题创建了考试。

现在Exam.objects.all() 回归

<QuerySet [<Exam: google>, <Exam: english>, <Exam: >]>

问题是由于有一个长度为零的字符串作为考试对象之一的主题。现在我使用Exam.objects.get(subject="").delete() 删除了该考试。问题解决了。

% url 'map:exam-detail' exam.subject %

% url 'map:exam-detail' exam %

% url 'map:exam-detail' exam.pk %

所有这些现在都在工作,因为所有这些都在返回主题。但是% url 'map:exam-detail' exam.id % 行不通。因为我在Exam model中将subject设为primary_key,所以Exam model没有属性id(默认添加的时候没有提到primary_key)。

思考为什么它接受空字符串作为主题,虽然我已经将它定义为primary_key。 然后我想了解 django.db.models.TextField 并键入帮助(TextField)并得到

TextField(verbose_name=None, name=None, primary_key=False, max_length=None, unique=False, blank=False, null=False, db_index=False, rel=None, default=<class 'django.db.models.fields.NOT_PROVIDED'>, editable=True, serialize=True, unique_for_date=None, unique_for_month=None, unique_for_year=None, choices=None, help_text='', db_column=None, db_tablespace=None, auto_created=False, validators=(), error_messages=None)

现在尝试了验证器... 后续问题link

谢谢大家 穆尼卡

【讨论】:

以上是关于NoReverseMatch at / 模板渲染期间出错的主要内容,如果未能解决你的问题,请参考以下文章

渲染时 NoReverseMatch:“django.contrib.auth.views.login”的反向

包含收藏按钮后的 NoReverseMatch

NoReverseMatch at / 实现注释选项时出错

如何修复 NoReverseMatch Django 错误?

NoReverseMatch at ...... in django

django 偶尔会抛出一个 NoReverseMatch