3

正規表現がdjangoを使用して何にも一致しなかった場合に、デフォルトのパラメータをアクションに渡す方法はありますか?


urlpatterns = patterns('',(r'^test/(?P<name>.*)?$','myview.displayName'))

#myview.py
def displayName(request,name):
      # write name to response or something

urlpatterns の 3 番目のパラメーターを ' を含む辞書に設定し、name パラメーターにメソッドのデフォルト値を指定しようとしましたが、どれも機能しませんでした。name パラメータは常に None のようです。デフォルト値を設定できる場合、None のチェックをコーディングしたくありません。

明確化:これは私が変更していたものの例です。


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

urlpatterns = patterns('',
      (r'^test/(?P<name>.*)?$',
        'myview.displayName',
        dict(name='Test')
      )
)

ビューにブラウザを向けると、「なし」というテキストが表示されます

何か案は?

4

2 に答える 2

9

問題は、パターンが 'test/' と一致する場合、正規表現によってキャプチャされた groupdict にマッピング 'name' => None が含まれていることです:

>>> url.match("test/").groupdict()
{'name': None}

これは、ビューが呼び出されたときに、次のようなものを使用することを意味します。

view(request, *groups, **groupdict)

これは次と同等です:

view(request, name = None)

「test/」の場合、名前が割り当てられていないのではなく、None が割り当てられていることを意味します。

これにより、2 つのオプションが残ります。あなたはできる:

  1. ちょっとハックなビューコードで None を明示的にチェックしてください。
  2. URL ディスパッチ ルールを書き直して、名前のキャプチャをオプションでなくし、名前が指定されていない場合にキャプチャする 2 つ目のルールを導入します。

例えば:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)$','myview.displayName'), # note the '+' instead of the '*'
    (r'^test/$','myview.displayName'),
)

2 番目のアプローチを取る場合は、キャプチャ パターンを使用せずにメソッドを呼び出すだけで、Python にデフォルト パラメータを処理させるか、デリゲートする別のビューを呼び出すことができます。

于 2008-10-24T19:39:04.607 に答える
0

私はあなたができると思っdef displayName(request, name=defaultObj)た; 少なくとも私は過去にそうしてきました。デフォルト値を何に設定していましたか?

于 2008-10-24T18:25:42.147 に答える