51

昨日、このチュートリアルを使用して最初のアプリに取り組んでいました。それは投票と選択のアプリです。最初のページには質問が表示され、質問をクリックすると、投票できる選択肢が表示されるはずです。

昨日私を助けてくれて、名前空間を使うように言われた素晴らしい人たちがいました。名前空間のチュートリアルを読み、自分の知識をシナリオに適用しようとしましたが、今のところ機能していません。

これは、最初のページである質問をクリックしたときの私のエラーです。

 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、およびmyappURLCONFとviews.pyというアプリに隠されていることがわかりました。

現在、私のメインの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'),


)

myapp内の私のviews.pyは次のとおりです。

 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 \ templates \ 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>
4

13 に答える 13

124

答えは、名前空間をルート URLconf に追加することです。mysite/urls.py ファイル (アプリケーションではなくプロジェクトの urls.py) で、名前空間を含めるように変更します。

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

さらに、チュートリアルNamespacing URL namesのパート 3 では、 app_nameの使用が、polls 名前空間を追加するための受け入れられた方法として言及されています。polls/urls.py次のように、この行を追加できます。

app_name = 'polls'
urlpatterns = [
    ...
]
于 2013-04-25T09:42:50.293 に答える
18

同じ Django チュートリアルに従い、同じ名前を持っているため、mysite/urls.py 以下から変更する必要がありました。

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

に:

 url(r'^polls/', include('polls.urls', namespace="polls")),
于 2015-02-22T19:23:17.260 に答える
8

次の行を detail.html の先頭に追加する必要があります。

{% load url from future %}

(polls 名前空間を使用するために、既に index.html でこの行を使用していることに注意してください)

于 2013-02-28T19:59:30.243 に答える
7

myapp/urls.py 内に、次のモジュール レベルの属性を追加します。

app_name = "polls"

これにより、そのアプリケーションの「アプリケーション名前空間名」が設定されます。逆に "polls:submit" のような名前を使用すると、Django はアプリケーションの名前空間 (上記のように設定) とインスタンスの名前空間 ("url" 関数の namespace= パラメーターを使用して設定) の 2 つの場所を調べます。プロジェクトにアプリのインスタンスが複数ある場合は後者が重要ですが、通常は前者が必要です。

私はまさにこの問題を抱えており、namespace= を url() 関数に設定すると、どういうわけか間違っているように見えました。

チュートリアルのこのエントリを参照してください: https://docs.djangoproject.com/en/1.9/intro/tutorial03/#namespacing-url-names

更新: この情報は Django 1.9 に対して正しいものです。1.9 より前では、namespace= 属性をインクルードに追加するのが実際に適切な方法でした。

于 2015-12-28T21:43:38.920 に答える
5

名前空間を見逃したと思います:

urlpatterns = patterns('',
    url(r'^polls/', include('polls.urls', namespace="polls")),
)
于 2016-07-06T12:07:49.757 に答える
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>
于 2013-02-15T10:56:44.953 に答える
1

Replacing the line: {% url 'polls:vote' poll.id %} with: {% url 'vote' poll.id %} worked out for me...

于 2013-09-10T19:47:18.430 に答える
1

私も同じ問題に直面しました。app_name = "<name of your app>"追加することで修正され ましたapp/urls.py

于 2019-07-15T06:37:27.887 に答える
0

名前空間を polls/urls.py ファイルに追加する必要があります。

url(r'^myapp/$', include('myapp.urls',  namespace ='myapp')),
于 2015-08-27T11:10:56.120 に答える
0

「django-hosts」を使用している場合:

私は同じエラーがあり、これをテンプレートに追加すると解決しました(名前空間などはありません):

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

PARENT_HOST = 'YOUR_PARENT_HOST'さらに、settings.pyに追加しました

参照

于 2019-05-21T14:06:37.840 に答える
-2

問題はチュートリアルにあります。URLconf に名前空間 (この場合は「myapp」) を追加する際、チュートリアルでは次の行コードを使用します。

app_name = 'myapp'

Django フレームワークは、何らかの理由でこれを Unicode 文字列として扱います。代わりに、アプリの名前を一重引用符ではなく二重引用符で囲んでください。例えば、

app_name = "myapp"

これにより、問題が最も確実に解決されます。私は同じ問題を抱えていましたが、そうすることで解決しました。

于 2016-07-15T09:51:13.293 に答える