web-dev-qa-db-ja.com

引数「()」およびキーワード引数「{}」が見つからない「*」の逆

レンダリング中に例外をキャッチしました:

引数 '()'およびキーワード引数 '{}'が見つからない 'products.views.'filter_by_led'の逆.

products.views.filter_by_ledをシェルから正常にインポートできたので、パスが正しくなるように機能しました。

Urls.pyは次のとおりです。

(r'^led-tv/$', filter_by_led ),

これは、エラーが生成されている場所です。

href="{% url products.views.filter_by_led %}">

これは同じファイルでうまく機能するため、理解できません:

{% url products.views.lcd_screen_size screen_size=50 %}

関数の定義は次のとおりです。

def filter_by_led(request):

Django=は、関数がその関数のReverseを見つけることができないと考えるだろうという理由がわかりません。

すべての*.pycファイルを削除し、Apacheを再起動しました。

何が間違っていますか?

60
BryanWheelock

私は頭の外から考えることができる3つのことがあります:

  1. named urls を使用しただけで、とにかくより堅牢で維持しやすい
  2. (おそらく)より良いエラーのために、コマンドラインでDjango.core.urlresolvers.reverseを使用してみてください

    >>> from Django.core.urlresolvers import reverse
    >>> reverse('products.views.filter_by_led')
    
  3. そのビューを指すURLが複数あるかどうかを確認します

53
Jiaaro

reverse(上記のように)へのシェル呼び出しはこれらの問題をデバッグするのに非常に良いですが、2つの重大な条件があります:

  • あなたはmustビューに必要な引数と一致する引数を指定する必要があります。
  • これらのargumentsは正規表現パターンに一致する必要があります。

はい、それは論理的です。はい。reverseは例外をスローするだけで、それ以上のヒントは表示されないため、混乱を招きます。

URLパターンの例:

url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'),

そして、シェルで何が起こるか:

>>> from register_site.views import show_cookies
>>> reverse(show_cookies)
NoReverseMatch: Reverse for 'register_site.views.show_cookies' with arguments '()' and keyword arguments '{}' not found.

引数を指定しなかったため、機能しません。

>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'})
'/cookies/aaa/123'

今ではうまくいきましたが...

>>> reverse('show_cookies', kwargs={'url_id':'x','hostname': 'www.dupa.com'})
NoReverseMatch: Reverse for 'show_cookies' with arguments '()' and keyword arguments '{'url_id': 'x', 'hostname': 'www.dupa.com'}' not found.

url_idが正規表現(予想される数値、指定された文字列)と一致しなかったため、動作しませんでした。

reverseを位置引数とキーワード引数の両方で使用できます。構文は次のとおりです。

reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)

urlテンプレートタグに関しては、面白いことがあります。 Django documentation は、引用符で囲まれたビュー名の使用例を示します。

{%url 'news.views.year_archive' yearvar%}

したがって、HTMLテンプレートで同様の方法で使用しました。

{%url 'show_cookies' hostname = u.hostname url_id = u.pk%}

しかし、これは私にはうまくいきませんでした。しかし、例外メッセージは、何が間違っている可能性があるかのヒントを与えてくれました-ビュー名を囲む二重引用符に注意してください:

引数付きの '' show_cookies ''の逆...

Iremoved引用符を削除すると動作し始めました:

{%url show_cookies hostname = u.hostname url_id = u.pk%}

そして、これはis紛らわしいです。

36
kravietz

ビュー名を単一引用符で囲む必要があります

{% url 'viewname' %}

の代わりに

{% url viewname %}
11
Charlie

私は同様の問題を抱えていて、解決策は「$」(文字列の終わり)文字の正しい使用法でした:

私のメインのurl.pyはこのように見えました($文字に注意してください):

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

また、card_purchasesアプリのurl.pyは次のように述べています。

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

「$」を2回使用しました。したがって、簡単な変更が機能しました。

urlpatterns = [
url(r'^admin/', include(admin.site.urls )),
url(r'^cp/', include('card_purchase.urls' )),
]

2番目のURLの変更に注目してください! card_purchasesアプリのurl.pyは次のようになります。

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

これとは別に、名前付きURLを囲む引用符が重要であることを確認できます!

4
Hendrik F

それが誰かを助ける場合、私は同様の問題を抱えていましたが、エラーは2つの理由によるものでした:

  1. URL名の前にアプリの名前空間を使用していない

    {% url 'app_name:url_name' %}
    
  2. URL名の前後に一重引用符がありません(指摘されているように ここ チャーリー)

2
Anupam
{% url 'polls:create' poll.id %}
1
Raghu

URLエントリに末尾のスラッシュは必要ないと思います。すなわち、代わりにこれを置きます:

(r'^led-tv$', filter_by_led ),

これは、デフォルトの 末尾のスラッシュ が有効になっていることを前提としています。

0
Chase Seibert