Подтвердить что ты не робот

Django Error u "'polls" не является зарегистрированным пространством имен

Вчера я работал над своим первым приложением, используя этот учебник. Это приложение "Опрос и выбор". На первой странице отображается вопрос, и когда вы нажимаете на вопрос, он должен отображать варианты, на которые вы можете проголосовать.

У меня были замечательные люди, которые помогли мне вчера и сказали мне использовать пространство имен. Я прочитал учебник по пространству имен и попытался применить свои знания к сценарию, но он пока не работает.

Это моя ошибка, когда я нажимаю на вопросы, которые являются первой страницей.

 NoReverseMatch at /polls/5/

 u"'polls" is not a registered namespace

 Request Method:    GET
 Request URL:   http://127.0.0.1:8000/polls/5/
 Django Version:    1.4.3
 Exception Type:    NoReverseMatch
 Exception Value:   

 u"'polls" is not a registered namespace

 Exception Location:    C:\hp\bin\Python\Lib\site-packages\django\template\defaulttags.py in render, line 424
 Python Executable:     C:\hp\bin\Python\python.exe
 Python Version:    2.5.2
 Python Path:   

 ['C:\\djcode\\mysite',
  'C:\\hp\\bin\\Python\\python25.zip',
  'C:\\hp\\bin\\Python\\DLLs',
  'C:\\hp\\bin\\Python\\lib',
  'C:\\hp\\bin\\Python\\lib\\plat-win',
  'C:\\hp\\bin\\Python\\lib\\lib-tk',
  'C:\\hp\\bin\\Python',
  'C:\\hp\\bin\\Python\\lib\\site-packages',
  'C:\\hp\\bin\\Python\\lib\\site-packages\\win32',
  'C:\\hp\\bin\\Python\\lib\\site-packages\\win32\\lib',
  'C:\\hp\\bin\\Python\\lib\\site-packages\\Pythonwin']

 Server time:   Fri, 15 Feb 2013 21:04:10 +1100
 Error during template rendering

 In template C:\djcode\mysite\myapp\templates\myapp\detail.html, error at line 5
 u"'polls" is not a registered namespace
 1  <h1>{{ poll.question }}</h1>
 2  
 3  {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
 4  
 5  {% url 'polls:vote' poll.id %}
 6  {% csrf_token %}
 7  {% for choice in poll.choice_set.all %}
 8  <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
 9  <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
 10     {% endfor %}
 11     <input type="submit" value="Vote" />
 12     </form>

Теперь я знаю, что проблемы скрыты в detail.html, мои основные URL-адреса и мое приложение, называемое myapp URLCONF и views.py

Теперь My main URLconf: C:\djcode\MySite\MySite

 from django.conf.urls import patterns, include, url
 from django.contrib import admin
 from django.conf import settings
 # Uncomment the next two lines to enable the admin:
 # from django.contrib import admin
 admin.autodiscover()

 urlpatterns = patterns('',
     #url(r'^polls/', include('myapp.urls')),
     url(r'^polls/', include('myapp.urls', namespace='polls')),                   
     url(r'^admin/', include(admin.site.urls)),
 )

Моя папка приложения называется myapp, и это myapp URLconf: C:\djcode\MySite\MyApp

 from django.conf.urls import patterns, include, url
 from django.contrib import admin
 from django.conf import settings

 from django.conf.urls import patterns, include, url

 urlpatterns = patterns('myapp.views',
     url(r'^$', 'index'),
     url(r'^(?P<poll_id>\d+)/$', 'detail'),
     url(r'^(?P<poll_id>\d+)/results/$', 'results'),
     url(r'^(?P<poll_id>\d+)/vote/$', 'vote'),


)

Мои view.py внутри myapp:

 from django.http import HttpResponse
 from myapp.models import Poll ,choice
 from django.template import Context, loader
 from django.http import Http404
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext

 def index(request):
     latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
     return render_to_response('myapp/index.html', {'latest_poll_list': latest_poll_list})

 def results(request, poll_id):
     p = get_object_or_404(Poll, pk=poll_id)
     return render_to_response('myapp/results.html', {'poll': p})

 def vote(request, poll_id):
     p = get_object_or_404(Poll, pk=poll_id)
     try:
         selected_choice = p.choice_set.get(pk=request.POST['choice'])
     except (KeyError, Choice.DoesNotExist):
         # Redisplay the poll voting form.
         return render_to_response('myapp/detail.html', {
             'poll': p,
             'error_message': "You didn't select a choice.",
         }, context_instance=RequestContext(request))
     else:
         selected_choice.votes += 1
         selected_choice.save()
         # Always return an HttpResponseRedirect after successfully dealing
    # with POST data. This prevents data from being posted twice if a
         # user hits the Back button.
         return HttpResponseRedirect(reverse('myapp.views.results', args=(p.id,)))

 def detail(request, poll_id):
     p = get_object_or_404(Poll, pk=poll_id)
     return render_to_response('myapp/detail.html', {'poll': p},
                                context_instance=RequestContext(request))

My detail.html C:\djcode\MySite\MyApp\Шаблоны\MyApp

 <h1>{{ poll.question }}</h1>

 {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

 {% url 'polls:vote' poll.id %}
 {% csrf_token %}
 {% for choice in poll.choice_set.all %}
     <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
     <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
 {% endfor %}
 <input type="submit" value="Vote" />
 </form>
4b9b3361

Ответ 1

 from django.conf.urls import patterns, include, url
 from django.contrib import admin
 from django.conf import settings



 urlpatterns = patterns('myapp.views',
     url(r'^$', 'index', name="index"),
     url(r'^(?P<poll_id>\d+)/$', 'detail', name="detail"),
     url(r'^(?P<poll_id>\d+)/results/$', 'results', name="results"),
     url(r'^(?P<poll_id>\d+)/vote/$', 'vote', name="vote"),
)

----------------------------------    

 <h1>{{ poll.question }}</h1>

 {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

 <form method="post" action="{% url myapp:vote poll.id %}">
 {% csrf_token %}
 {% for choice in poll.choice_set.all %}
     <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
     <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
 {% endfor %}
 <input type="submit" value="Vote" />
 </form>

Ответ 2

Пожалуйста, внимательно прочитайте официальный Django Doc, и вы найдете наиболее подходящий ответ.

Ответ заключается в том, чтобы добавить пространства имен в корневой URL-адрес. В файле mysite/urls.py(проекты urls.py, а не приложения), продолжайте и измените его, чтобы включить пространство имен:

urlpatterns = patterns('',
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
)

Кроме того, в третьей части учебника Имена имен имен имен использование имени app_ упоминается как принятый способ добавления пространства имен опросов. Вы можете добавить строку для этого в polls/urls.py следующим образом:

app_name = 'polls'
urlpatterns = [
    ...
]

Ответ 3

Следуя тому же учебнику Django и имеющему те же имена, Мне пришлось изменить в mysite/urls.py из:

url(r'^polls/', include('polls.urls')),

to:

 url(r'^polls/', include('polls.urls', namespace="polls")),

Ответ 4

Вам нужно добавить следующую строку в начало detail.html:

{% load url from future %}

(Обратите внимание, что вы уже использовали эту строку в index.html, чтобы использовать пространство имен опросов)

Ответ 5

Внутри myapp/urls.py добавьте следующий атрибут уровня модуля:

app_name = "polls"

Это установит "имя пространства имен приложения" для этого приложения. Когда вы используете имена наподобие "polls: submit" в обратном порядке, Django будет искать в двух местах: пространства имен приложений (как указано выше) и пространства имен экземпляров (установите с помощью параметра namespace = = в функции "url"). Последнее важно, если у вас есть несколько экземпляров приложения для вашего проекта, но обычно это первое, которое вы хотите.

У меня была эта проблема, и установка namespace = в функцию url() казалась неправильной.

Смотрите эту запись учебника: https://docs.djangoproject.com/en/1.9/intro/tutorial03/#namespacing-url-names

Обновление: эта информация верна для Django 1.9. До версии 1.9 добавление атрибута namespace = в include действительно является правильным способом.

Ответ 6

Django 2.0

в yourapp/urls.py

from django.urls import path
from . import views

app_name = 'yourapp'

urlpatterns = [
    path('homepage/', views.HomepageView.as_view(), name='homepage'),
]

в urls.py

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('yourapp/', include('yourapp.urls')),
    ]

Ответ 7

Я думаю, вы пропустили пространство имен:

urlpatterns = patterns('',
    url(r'^polls/', include('polls.urls', namespace="polls")),
)

Ответ 8

Замена строки: {% url 'polls:vote' poll.id %} с: {% url 'vote' poll.id %} разработал у меня...

Ответ 9

в пространство имен следует добавить файл polls/urls.py.

url(r'^myapp/$', include('myapp.urls',  namespace ='myapp')),

Ответ 10

Для тех, кто использует "django-hosts":

У меня была та же ошибка, и для меня добавление этого в мой шаблон решило ее (без использования пространства имен и т.д.):

{% load hosts %}
<a href="{% host_url 'YOUR_URL' host 'YOUR_HOST' %}">Admin dashboard</a>

Кроме того, я добавил PARENT_HOST = 'YOUR_PARENT_HOST' в мои settings.py

Ссылка

Ответ 11

Я также столкнулся с той же проблемой. теперь это исправлено добавлением app_name = "<name of your app>" в app/urls.py

Ответ 12

Проблема в учебнике. Добавляя пространство имен (в вашем случае "myapp" ) к URLconf, учебник использует следующий код строки:

app_name = 'myapp'

Структура Django по какой-либо причине рассматривает ее как строку юникода. Вместо этого добавьте имя своего приложения в двойные кавычки вместо одиночных кавычек. Например,

app_name = "myapp"

Это, безусловно, решит вашу проблему. У меня была та же проблема, и я решил это решить.

Ответ 13

Перезапустите веб-сервер. Только это.