13

私は真新しいDjangoプロジェクトを持っています。に最小限のビュー関数を 1 つ追加しviews.py、URL パターンを 1つ追加urls.pyして、文字列ではなく関数参照でビューを渡します。

# urls.py
# -------

# coding=utf-8

from django.conf.urls.defaults import *

from myapp import views


urlpatterns = patterns('',
    url(r'^myview/$', views.myview),
)


# views.py
----------

# coding=utf-8

from django.http import HttpResponse


def myview(request):
    return HttpResponse('MYVIEW LOL',  content_type="text/plain")

reverse()関数参照を渡すことで、URL を取得するために使用しようとしています。しかし、reverse に渡したビュー関数が、URL パターンに入れたビュー関数とまったく同じであることを確認したにもかかわらず、一致が得られません。

>>> from django.core.urlresolvers import reverse
>>> import urls
>>> from myapp import views

>>> urls.urlpatterns[0].callback is views.myview
True

>>> reverse(views.myview)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Python/2.5/site-packages/django/core/urlresolvers.py", line 254, in reverse
    *args, **kwargs)))
  File "/Library/Python/2.5/site-packages/django/core/urlresolvers.py", line 243, in reverse
    "arguments '%s' not found." % (lookup_view, args, kwargs))
NoReverseMatch: Reverse for '<function myview at 0x6fe6b0>' with arguments '()' and keyword arguments '{}' not found.

ドキュメントからわかる限り、関数参照は URL パターンとreverse().

Django トランク、リビジョン 9092 を使用しています。

4

2 に答える 2

11

とった!!問題は、インポートの一部が のものでありmyproject.myapp.views、一部が のものであることですmyapp.views。これは Python モジュール システムを混乱させ、関数を同じオブジェクトとして検出しなくなります。これは、メインsettings.pyにおそらく次のような行があるためです。

ROOT_URLCONF = `myproject.urls`

これを解決するには、シェル セッションでフル インポートを使用してみてください。

>>> from django.core.urlresolvers import reverse
>>> from myproject.myapp import views
>>> reverse(views.myview)
'/myview/'

興味のある将来の読者のために、デバッグ セッションのログを次に示します。

>>> from django.core import urlresolvers
>>> from myapp import myview
>>> urlresolvers.get_resolver (None).reverse_dict
{None: ([(u'myview/', [])], 'myview/$'), <function myview at 0x845d17c>: ([(u'myview/', [])], 'myview/$')}
>>> v1 = urlresolvers.get_resolver (None).reverse_dict.items ()[1][0]
>>> reverse(v1)
'/myview/'
>>> v1 is myview
False
>>> v1.__module__
'testproject.myapp.views'
>>> myview.__module__
'myapp.views'

URL マッチを に変更するとどうなりますr'^myview/$'か?


ビュー名で試しましたか?みたいなreverse ('myapp.myview')

ルート URLconfですかurls.py、それともmyappアプリケーション内ですか? ビューを解決するには、ルートからビューへのフル パスが必要です。それが の場合、myproject/myapp/urls.py次のmyproject/urls.pyようなコードが必要になります。

from django.conf.urls.defaults import patterns
urlpatterns = patterns ('',
    (r'^/', 'myapp.urls'),
)
于 2008-09-28T19:17:44.470 に答える
1

2 つのコードの貼り付けが完了すると、reverse() への実際の呼び出しを行う 2 番目のようには見えず、urls モジュールがインポートされるため、url マッピングが実際に達成された場合.

于 2008-09-28T19:25:49.380 に答える