簡體   English   中英

NoReverseMatch at / 模板渲染期間出錯

[英]NoReverseMatch at / Error during template rendering

當我打開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"),
]

模型.py

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

    def __str__(self):
        return self.subject

主頁.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 %}

基本文件

{% 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]

視圖.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

您錯過了 home.html 中的exam.pk 以這種方式更新您的代碼,

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

在 python manage.py shell 中

from my_app_name.models import Exam

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

我已經執行了這些行。 我還為“谷歌”、“英語”等主題創建了考試。

現在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 模型中將subject作為primary_key ,所以 Exam model 沒有屬性 id(當沒有提到 primary_key 時默認添加)。

考慮為什么它接受空字符串作為主題,盡管我已將其定義為primary_key。 然后我想閱讀關於 django.db.models.TextField 和剛剛鍵入的 help(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)

現在嘗試驗證器...后續問題鏈接

謝謝大家穆尼卡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM