1

URLルーティング用にアプリに次のものがあります。

urls.py

urlpatterns = patterns('rocflavors.views',
   url('^detail/(?P<content_type>[^/]+)/(?P<slug>[^/]+)/(?P<asset_id>\d{1,32})$', 'flavors_detail', name='flavors_detail'),
)

ビュー.py

def flavors_detail(request, slug, asset_id, content_type, format="html"):

私が使用している引数は名前付き引数のようです。(content_type、slug、asset_id)。

Django/pythonは、位置引数とキーワード引数をいつ渡すかをどのように知っていますか?

このflavors_detail関数は 5 つの引数を受け入れますが、URL では順序が正しくありません。

4

1 に答える 1

2

あなたの質問に答えるために、flavor_detail4つの引数を(順番に)受け入れ、1つのキーワード引数を受け入れます。正規表現は、url見つかった一致を順番に渡しますが、各引数のキーワードも定義しているため、代わりにkwarg辞書を渡します。変数名の一貫性を維持しているため、これdictにより正しい引数が正しい場所に渡されます(異なる変数名を使用した場合、これは機能しませんでした)。flavors_detail以下に説明するように、のキーワード引数を指定するだけで、この「魔法」を回避できます。

あなたurlはそれらを定義する正規表現です:

 ?P<content_type>

を生成しkwarg content_typeます。rePythonのモジュールをチェックしてください( docs)。

(?P<name>...) 通常の括弧に似ていますが、グループによって一致するサブストリングは、シンボリックグループ名nameを介して正規表現の残りの部分からアクセスできます。グループ名は有効なPython識別子である必要があり、各グループ名は正規表現内で1回だけ定義する必要があります。シンボリックグループも、グループに名前が付けられていないかのように、番号が付けられたグループです。したがって、以下の例でidという名前のグループは、番号付きグループ1として参照することもできます。

変数をキーワードargsとして定義しているのでkwargs、kwargsを受け入れるようにビュー宣言を変更できます。

def flavors_detail(request, slug=slug, asset_id=asset_id, content_type=content_type, format="html"):

ただし、引数の順序を維持するように注意している限り、Pythonは以前の定義も受け入れます(私のコメントは時期尚早でした)。これがどのように起こったかについてのより多くの情報がここにあります-引用する

キーワード引数が存在する場合、それらは最初に位置引数に変換されます

于 2013-03-19T18:38:07.007 に答える