Erreur Django u «polls» n’est pas un espace de noms enregistré

Hier, je travaillais sur ma première application en utilisant ce tutoriel. C’est une application de sondage et de choix. La première page affiche la question et lorsque vous cliquez sur la question, vous devez afficher les choix sur lesquels vous pouvez voter.

J’ai eu des gens formidables qui m’ont aidé hier et m’ont dit d’utiliser un espace de noms. J’ai lu le tutoriel sur l’espace de noms et j’ai essayé d’appliquer mes connaissances au scénario, mais cela ne fonctionne pas jusqu’à présent.

C’est mon erreur quand je clique sur les questions qui constituent la première page.

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 

{{ poll.question }}

2 3 {% if error_message %}

{{ error_message }}

{% endif %} 4 5 {% url 'polls:vote' poll.id %} 6 {% csrf_token %} 7 {% for choice in poll.choice_set.all %} 8 9
10 {% endfor %} 11 12

Maintenant, je sais que les problèmes sont cachés dans detail.html, mes URL principales et mon application appelée myapp URLCONF et views.py

Maintenant, mon principal URLconf est: C: \ djcode \ mysite \ mysite

  from django.conf.urls import patterns, include, url from django.consortingb import admin from django.conf import settings # Uncomment the next two lines to enable the admin: # from django.consortingb 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)), ) 

Mon dossier d’application s’appelle myapp et c’est myapp URLconf: C: \ djcode \ mysite \ myapp

  from django.conf.urls import patterns, include, url from django.consortingb 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\d+)/$', 'detail'), url(r'^(?P\d+)/results/$', 'results'), url(r'^(?P\d+)/vote/$', 'vote'), ) 

Mes vues.py dans myapp sont:

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

Mon detail.html C: \ djcode \ mysite \ myapp \ templates \ myapp

  

{{ poll.question }}

{% if error_message %}

{{ error_message }}

{% endif %} {% url 'polls:vote' poll.id %} {% csrf_token %} {% for choice in poll.choice_set.all %}
{% endfor %}

  from django.conf.urls import patterns, include, url from django.consortingb import admin from django.conf import settings urlpatterns = patterns('myapp.views', url(r'^$', 'index', name="index"), url(r'^(?P\d+)/$', 'detail', name="detail"), url(r'^(?P\d+)/results/$', 'results', name="results"), url(r'^(?P\d+)/vote/$', 'vote', name="vote"), ) ---------------------------------- 

{{ poll.question }}

{% if error_message %}

{{ error_message }}

{% endif %}
{% csrf_token %} {% for choice in poll.choice_set.all %}
{% endfor %}

Veuillez lire attentivement le Doc Django officiel et vous trouverez la réponse la plus adaptée.

La réponse est d’append des espaces de noms à votre URLconf racine. Dans le fichier mysite / urls.py (le fichier urls.py du projet, pas celui de l’application), continuez et changez-le pour inclure un espace de noms:

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

De plus, dans la partie 3 du didacticiel, les URL de namespacing désignent l’utilisation de app_name comme méthode acceptée pour append l’espace de noms des sondages. Vous pouvez append la ligne pour cela dans vos polls/urls.py comme suit:

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

Après le même tutoriel Django et ayant les mêmes noms, je devais changer mysite/urls.py partir de:

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

à:

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

Vous devez append la ligne suivante en haut du detail.html:

 {% load url from future %} 

(Notez que vous avez déjà utilisé cette ligne dans le fichier index.html pour utiliser l’espace de noms polls)

Dans myapp / urls.py, ajoutez l’atsortingbut de niveau module suivant:

 app_name = "polls" 

Cela définira le “nom de l’espace d’application” pour cette application. Lorsque vous utilisez des noms tels que “polls: submit” dans un sens inverse, Django examinera deux espaces: les espaces de noms des applications (définis comme ci-dessus) et les espaces de noms des instances (définis avec le paramètre namespace = dans la fonction “url”). Ce dernier point est important si vous avez plusieurs instances d’une application pour votre projet, mais en général c’est la première que vous voulez.

J’ai eu ce problème, et définir namespace = dans la fonction url () semblait mal en quelque sorte.

Voir cette entrée du tutoriel: https://docs.djangoproject.com/en/1.9/intro/tutorial03/#namespacing-url-names

Mise à jour: cette information est correcte pour Django 1.9. Avant 1.9, l’ajout d’un namespace = atsortingbut à l’inclusion est, en effet, le bon moyen.

Je pense que vous avez manqué l’espace de noms:

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

Django 2.0

dans yourapp / urls.py

 from django.urls import path from . import views app_name = 'yourapp' urlpatterns = [ path('homepage/', views.HomepageView.as_view(), name='homepage'), ] 

dans urls.py

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

Remplacement de la ligne: {% url 'polls:vote' poll.id %} avec: {% url 'vote' poll.id %} fonctionné pour moi …

L’espace de noms doit être ajouté au fichier polls / urls.py.

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

Redémarrez le serveur Web. Juste ça.

Le problème est dans le tutoriel. En ajoutant l’espace de noms (dans votre cas “myapp”) à votre URLconf, le tutoriel utilise le code de ligne suivant:

 app_name = 'myapp' 

Le framework Django, pour une raison quelconque, le traite comme une chaîne Unicode. Au lieu de cela, placez le nom de votre application entre guillemets au lieu de guillemets simples. Par exemple,

 app_name = "myapp" 

Cela résoudra très certainement votre problème. J’ai eu le même problème et j’ai résolu le problème.