2

I am making a web sit by seeing Django tutorial. I got an error:

NoReverseMatch at /polls/ Reverse for 'index' with no arguments not found. 1 pattern(s) tried: ['$/'].

error

Traceback said

Traceback:

File "/Users/XXX/django/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/Users/XXX/django/django/core/handlers/base.py" in _get_response
  130.                 response = self.process_exception_by_middleware(e, request)

File "/Users/XXX/django/django/core/handlers/base.py" in _get_response
  128.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/XXX/djangostudy/polls/views.py" in index
  23.         'questions': Question.objects.all(),

File "/Users/XXX/django/django/shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "/Users/XXX/django/django/template/loader.py" in render_to_string
  62.     return template.render(context, request)

File "/Users/XXX/django/django/template/backends/django.py" in render
  61.             return self.template.render(context)

File "/Users/XXX/django/django/template/base.py" in render
  175.                     return self._render(context)

File "/Users/XXX/django/django/template/base.py" in _render
  167.         return self.nodelist.render(context)

File "/Users/XXX/django/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/Users/XXX/django/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/Users/XXX/django/django/template/loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "/Users/XXX/django/django/template/base.py" in _render
  167.         return self.nodelist.render(context)

File "/Users/XXX/django/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/Users/XXX/django/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/Users/XXX/django/django/template/loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "/Users/XXX/django/django/template/base.py" in _render
  167.         return self.nodelist.render(context)

File "/Users/XXX/django/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/Users/XXX/django/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/Users/XXX/django/django/template/defaulttags.py" in render
  447.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)

File "/Users/XXX/django/django/urls/base.py" in reverse
  87.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File "/Users/XXX/django/django/urls/resolvers.py" in _reverse_with_prefix
  488.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /polls/
Exception Value: Reverse for 'index' with no arguments not found. 1 pattern(s) tried: ['$/']

I wrote in base.html which is in as same as parent's app is like

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

urls.py of parents' directory is

from django.conf.urls import include,url
from django.contrib import admin
from polls.views import index

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^polls/',include('polls.urls')),
    url(r'^$/',index,name='index'),
]

urls.py of child app whose name is polls is like

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

app_name="polls"
urlpatterns = [
    url(r'^$',views.index,name='index'),
    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'^$',TemplateView.as_view(template_name='app/index.html'),name='app_index'),
    url(r'^form$', views.form_test),
]

I really cannot understand why this error happens.Is the way of designating "{% url 'index' %}" wrong? how can I fix this?

My views.py is like

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

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

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()

My directory is directory

user8504021
  • 303
  • 5
  • 23

3 Answers3

1

On your urls.py files there are same urls for different views. Django will only consider the first url. Remove

        url(r'^$/',index,name='index'),

from parent will solve the problem

Self
  • 497
  • 1
  • 6
  • 19
  • thx,I deleted url of index from parent ,but NoReverseMatch at /polls/ Reverse for 'index' not found. 'index' is not a valid view function or pattern name. error happen.How can I fix this? – user8504021 Aug 25 '17 at 12:44
  • sorry, u should use url(r'^$/',views.index,name='index'), – Self Aug 25 '17 at 12:54
0

you have duplicate urls, and duplicate of url name index, try to fix it

for example in polls.urls

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='app/index.html'), name='app_index'),
    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'^form$', views.form_test),
]

in urls.py

urlpatterns = [
    url(r'^$',index,name='index'),
    url(r'^admin/', admin.site.urls),
    url(r'^polls/',include('polls.urls')),
]

urls ("Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.")

Brown Bear
  • 19,655
  • 10
  • 58
  • 76
  • @user8504021 i edit answer, for example, but you need to check logic – Brown Bear Aug 25 '17 at 12:53
  • thx,I fixed as u wrote,but TemplateDoesNotExist at /polls/ templates/polls/index.html error happen.I wrote url(r'^$',TemplateView.as_view(template_name='templates/polls/index.html'),name='app_index'), . I updated directory in question,so if u know something,please tell me. – user8504021 Aug 25 '17 at 13:12
  • @user8504021 look here [templatedoesnotexist](https://stackoverflow.com/questions/1926049/django-templatedoesnotexist), if not help you, add your settings `TEMPLATE_DIRS` to the question – Brown Bear Aug 25 '17 at 13:23
  • @user8504021 do you use `include` in your `/polls/templates/polls/index.html`, try replace to `template_name='poll‌​s/index.html'` – Brown Bear Aug 25 '17 at 13:27
  • i added TEMPLATE_DIRS to my parent's setting.py like TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'templates'), ) – user8504021 Aug 25 '17 at 13:38
  • But TemplateDoesNotExist at /polls/ templates/polls/index.html error happens. BASE_DIR is BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) how can I fix this? – user8504021 Aug 25 '17 at 13:39
  • I rewrote polls.urls.py like from django.conf.urls import url from django.views.generic import TemplateView from . import views app_name="polls" urlpatterns = [ # url(r'^$/',views.index,name='index'), url(r'(?P\d+)/$', views.detail, name='poll_detail'), url(r'(?P\d+)/vote$', views.vote, name='poll_vote'), url(r'(?P\d+)/results$', views.results, name='poll_results'), url(r'^$',TemplateView.as_view(template_name='poll‌​s/index.html'),name='app_index'), url(r'^form$', views.form_test), ] – user8504021 Aug 25 '17 at 13:50
  • but TemplateDoesNotExist at /polls/ poll‌​s/index.html error happens.How can I fix this? – user8504021 Aug 25 '17 at 13:50
  • try `template_name='base.html'` if it work, do new question with new error, it is difficult to read, code in the comments – Brown Bear Aug 25 '17 at 13:54
0

Well, you don't have duplicate urls because you're working with apps, so the problem is here url(r'^$/', that's wrong the correct way is url(r'^$' the reason is you always must set the $ at the end of the URL, try that and tell me

Mauricio Cortazar
  • 4,049
  • 2
  • 17
  • 27