Я делаю веб-сайт, увидев учебник по Django. Я получил ошибку, NoReverseMatch в / polls / Reverse для 'detail' not found. 'detail' не является допустимой функцией представления или именем шаблона. Было сказано как

Error during template rendering
In template /Users/xxx/djangostudy/templates/base.html, error at line 0
Reverse for 'detail' not found. 'detail' is not a valid view function or pattern name.

Я действительно не могу понять, почему ошибка происходит в строке 0. base.html (он находится в папке шаблона)

{% load staticfiles %}
{% load bootstrap3 %}
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../favicon.ico">

    <title>Starter Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
    <style type="text/css">
body {
  padding-top: 50px;
}
    </style>
  </head>

  <body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="{% url 'index' %}">Tutorial</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li class="{% block nav_polls %}{% endblock %}"><a href="{% url 'polls:index' %}">polls</a></li>
            <li class=""><a href="{% url 'admin:index' %}">admin</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

    <div class="container">
    {% bootstrap_messages messages %}
    {% block contents %}{% endblock %}
    </div><!-- /.container -->
    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
    <script src="{% static 'js/bootstrap.min.js' %}"></script>
  </body>
</html>

Index.html (это в опросах)

{% extends "polls/base.html" %}
{% load staticfiles %}
{% block contents %}
  <table border="1" class="table table-striped">
      <tr>
          <th>質問内容</th>
          <th>公開日</th>
          <th></th>
      </tr>
          {% for question in questions %}
      <tr>
         <td>{{ question.question_text }}</td>
         <td>{{ question.pub_date }}</td>
         <td><a href="{% url 'polls:detail' question.pk %}">詳細画面へ</a></td>
      </tr>
      {% endfor %}
  </table>
{% endblock contents %}

«деталь» означает detail.html, это

<!DOCTYPE html>
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'poll_vote' question.id %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Vote" />
</form>
</html>

Я думаю, что сообщение об ошибке означает, что index.html не может загрузить detail.html. Итак, я хочу это сделать, но я не знаю, как это сделать. Могу ли я написать что-то в строке 0 в index.html?

Views.py в опросах

from django.shortcuts import render
from django.urls import reverse_lazy
from django.utils.html import mark_safe
from .models import Question
from django.http import HttpResponse
from django.shortcuts import Http404
from django.shortcuts import get_object_or_404,redirect
from .models import Choice
from django.views.generic import TemplateView
from django.views.generic import DetailView
from django.views.generic import ListView
from .forms import MyForm
from .forms import VoteForm
from django.views.generic import FormView
from django.views.generic.detail import SingleObjectMixin
from django.shortcuts import resolve_url



# Create your views here.
def index(request):
    return render(request,'polls/index.html',{
        'questions': Question.objects.all(),
    })

# def detail(request,pk):
#     obj = get_object_or_404(Question,pk=pk)
#     if request.method == "POST":
#         form = VoteForm(question=obj,data=request.POST)
#         if form.is_valid():
#             form.vote()
#             return redirect('polls:results',pk)
#     else:
#         form = VoteForm(question=obj)
#     return render(request,'polls/detail.html',{
#         'form':form,
#         'question': obj,
#     })

def vote(request,pk):
    question = get_object_or_404(Question,pk=pk)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError,Choice.DoesNotExist):
        return render(request,'poll/detail.html',{
            'question':question,
            'error_message':"You didn't select a choice",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return redirect('index')
    return redirect('poll_results', pk)
    # pass

def results(request,pk):
    obj = get_object_or_404(Question,pk=pk)
    return render(request,'polls/results.html',{
        'question':obj,
    })

class FormTest(FormView):
   form_class = MyForm
   template_name = 'polls/form.html'
   success_url = reverse_lazy('polls:index')
form_test = FormTest.as_view()

class Detail(SingleObjectMixin,FormView):
    model = Question
    form_class = VoteForm
    context_object_name = 'question'
    template_name = 'polls/detail.html'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['question'] = self.object
        return kwargs

    def form_valid(self, form):
        form.vote()
        return super().form_valid(form)

    def get_success_url(self):
        return resolve_url('polls:results',self.kwargs['pk'])

detail = Detail.as_view()

Urls.py в опросах есть

from django.conf.urls import url
from django.views.generic import TemplateView
from . import views

app_name="polls"
urlpatterns = [
    url(r'(?P<pk>\d+)/$', views.detail, name='poll_detail'),
    url(r'(?P<pk>\d+)/vote$', views.vote, name='poll_vote'),
    url(r'(?P<pk>\d+)/results$', views.results, name='poll_results'),
    url(r'^$',views.index,name='index'),
    url(r'^form$', views.form_test),
]

Каталог введите описание изображения здесь

Как я могу это исправить?

1
user8504021 27 Авг 2017 в 15:13

3 ответа

Лучший ответ

У вас есть опечатка:

<a href="{% url 'polls:detail' question.pk %}">

Кому

<a href="{% url 'polls:poll_detail' question.pk %}">
 <!--                 ^^^^^^^  -->
3
Bear Brown 27 Авг 2017 в 12:21
<td><a href="{% url 'polls:detail' question.pk %}">詳細画面へ</a></td> 

Вы должны изменить urls.py в djangostudy, чтобы использовать

Укажите пространство имен, как указано в urls.py, или используйте имя «poll_detail», указанное в polls / urls.py

Обратите внимание, что опросы: это обозначается как пространство имен, а poll_detail указывается по имени.

0
장진우 27 Авг 2017 в 13:05

{% url %} принимает имя URL-адреса , определенного в urlpatterns, в конечном итоге соответствующего представлению. Дело не в том, существует или нет detail.html, вы не можете напрямую ссылаться на detail.html, потому что вам нужен вид, который говорит, как его отобразить.

Используйте {% url 'poll_detail' ... %}, поскольку именно так вы назвали свое представление.

См. Документацию здесь: https://docs.djangoproject.com/ ен / 1,11 / исх / шаблоны / встроенные функции / # URL

3
Alex Hall 27 Авг 2017 в 12:27