0

オプションのキーワード引数を 3 つ取る Django ビューがあります。このビューに可能な URL を一致させるための正規表現を 1 行で処理したいと考えています。URLをうまく構成したい。

例: 私の可能なパラメータは、int である start、長さ 13 の文字列である serial、および別の int である end です。

URL は次のようになります。

/main/s20130509/e20130510/ABC1234567890
or
/main/s20130509/e20130510/
or 
/main/ABC1234567890

e と s の接頭辞が付いたコンポーネントはそれぞれ end と start で、ABC1234567890 はシリアルです。

これらの終了、開始、シリアル値を取得し、値 start=s20130509 などとしてビューに渡したい...

現在、順列を別の行に徹底的にリストすることでこれを行っていますが、もっと良い方法があるはずです。

私は次のようなことをしようとしています:

url(r'^base_url/(?P<serial>[^/]{13}|(?P<end>e\d{8})|(?P<start>s\d{8})/*$', view_method),

基本的に、私がやりたいことのロジックは明確です。3 つの一致のいずれかのすべてのインスタンスを取得し、それらをキーワード付きパラメーターとして渡したいのですが、これに適合する ReGex 構文を理解するためのリソースが見つかりません。

何かご意見は?私は、仕事を優雅に終わらせることは何でも喜んで行います。

御時間ありがとうございます、

ティム

4

1 に答える 1

1

あなたが望んでいるのは:

url(r'^base_url/(?P<serial>[^/]{13}/$', view_method),

endおよびstartkwargsのオプションのグループを追加すると、次のようになります。

# Optional, non-capturing group surrounding the named group for each (so you don't have to capture the slashes or the "e" or "s"
(?:e(?P<end>\d{8})/)

次に、いずれかの順序で最大 2 つまで許可します。

((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}

結果は次のとおりです。

url(r'^base_url/((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}(?P<serial>[^/]{13})/$', view_method),

免責事項、これはこのボックスに書いたので、テストして回答を更新するのに少し時間がかかります(間違っている場合)。

アップデート:

確かに、それはうまくいきました:)私は以下を一致させました:

http://127.0.0.1:8080/base_url/e77777777/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/1234567890123/

kwargs は次のようになりました ( 3 つのセグメントすべてで要求された場合getのサブクラスのメソッドからの例外で発生します - 終了および/または開始は除外された場合です):ViewNone

{'start': u'88888888', 'serial': u'1234567890123', 'end': u'77777777'}
于 2013-05-09T22:33:14.923 に答える