NoReverseMatch at / Ошибка во время рендеринга шаблона - PullRequest
0 голосов
/ 25 февраля 2020

Когда я открываю http://127.0.0.1:8000/, то есть home.html, я получаю:

NoReverseMatch в / и Обратный для 'подробности экзамена' с аргументами '(' ',)' не найден , Попробован 1 шаблон (ов): ['exam / (? P [^ /] +) $']

Я думаю, что ошибка связана с <str:pk> в urls.py.

Файл 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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

В python manage.py shell

from my_app_name.models import Exam

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

Я выполнил эти строки. и я также создал экзамены по таким предметам, как "google", "engli sh", ..

Теперь 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 %} не будет работать . Потому что я subject как primary_key в модели экзамена , поэтому модель экзамена не имеет идентификатора атрибута (который добавляется по умолчанию, когда не используется 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)

Теперь попробовал валидаторы ... Проблема с последующими действиями ссылка

Спасибо всем Муника

0 голосов
/ 26 февраля 2020

Вы пропустили exam.pk в домашних условиях. html Обновите код таким образом,

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