Djangoを使用したアクションのデフォルトパラメーター
-
04-07-2019 - |
質問
正規表現がdjangoを使用して何にも一致しなかった場合に、デフォルトのパラメーターをアクションに渡す方法はありますか?
urlpatterns = patterns('',(r'^test/(?P<name>.*)?
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'))
#myview.py
def displayName(request,name):
# write name to response or something
urlpatternsの3番目のパラメーターを 'を含む辞書に設定し、nameパラメーターにメソッドのデフォルト値を指定しようとしましたが、どれも機能しませんでした。 nameパラメーターは常にNoneのようです。デフォルト値を設定できる場合、Noneのチェックをコーディングしたくありません。
明確化:ここに変更した例があります。
<*>
ビューでブラウザをポイントすると、テキストが表示されます
「なし」
アイデアはありますか
,
'myview.displayName',
dict(name='Test')
)
)
ビューでブラウザをポイントすると、テキストが表示されます 「なし」
アイデアはありますか
,'myview.displayName')) #myview.py def displayName(request,name): # write name to response or somethingurlpatternsの3番目のパラメーターを 'を含む辞書に設定し、nameパラメーターにメソッドのデフォルト値を指定しようとしましたが、どれも機能しませんでした。 nameパラメーターは常にNoneのようです。デフォルト値を設定できる場合、Noneのチェックをコーディングしたくありません。
明確化:ここに変更した例があります。
<*>ビューでブラウザをポイントすると、テキストが表示されます 「なし」
アイデアはありますか
解決
問題は、パターンが「test /」と一致する場合、正規表現によってキャプチャされたgroupdictにはマッピング「name」= gt;が含まれることです。なし:
>>> url.match("test/").groupdict()
{'name': None}
これは、ビューが呼び出されたときに、以下に似たものを使用することを意味します:
view(request, *groups, **groupdict)
これは次と同等です:
view(request, name = None)
'test /'の場合、名前が割り当てられずに割り当てられることを意味します。
これにより、2つのオプションが提供されます。次のことができます。
- ビューコードでハッキングのようなものがないことを明示的に確認します。
- URLディスパッチルールを書き換えて、名前のキャプチャをオプションにせず、名前が指定されていない場合にキャプチャする2番目のルールを導入します。
例:
urlpatterns = patterns('',
(r'^test/(?P<name>.+)
2番目のアプローチをとる場合、キャプチャパターンなしでメソッドを呼び出して、Pythonにデフォルトパラメータを処理させるか、委任する別のビューを呼び出すことができます。
,'myview.displayName'), # note the '+' instead of the '*'
(r'^test/
2番目のアプローチをとる場合、キャプチャパターンなしでメソッドを呼び出して、Pythonにデフォルトパラメータを処理させるか、委任する別のビューを呼び出すことができます。
,'myview.displayName'),
)
2番目のアプローチをとる場合、キャプチャパターンなしでメソッドを呼び出して、Pythonにデフォルトパラメータを処理させるか、委任する別のビューを呼び出すことができます。
他のヒント
私は考えできます def displayName(request、name = defaultObj)
;少なくとも私が過去にやったことです。デフォルト値を何に設定しましたか?