2009-08-30 5 views
25

誰かが、オプションのパラメータを許可するURLパターンとビューを書く方法を説明してもらえますか?私はこれをうまくやったことがありますが、私はいつもURLテンプレートタグを破っています。ここでオプションでdjangoでパラメータを取得できますか?

は、私が現在持っているものです。

パターン

(r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so') 

ビュー

def so(request, required, optional): 

私は両方の引数を提供する。この例ではURLテンプレートタグを使用している場合は、それが動作しますうまくいく。しかし、省略可能な引数を省略すると、反転エラーが発生します。

どうすればこの問題を解決できますか?

おかげで、 ピート

私は、一般的に named urlを持つ2つのパターンを作る
+1

1.3のロードマップにあります: http://code.djangoproject.com/ticket/14772 –

答えて

37

(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', view='myapp.so', name='optional'), 
(r'^so/(?P<required>\d+)/$', view='myapp.so', kwargs={'optional':None}, name='required'), 
+2

はい、これは通常の方法です。 URLリバーサには正規表現についてのスマートが限られています(完全正規表現パーサーは実装されていません)。オプションパーツは処理できません。あなたはあなたのURLパターンで正規表現の完全な力を自由に使うことができますが、URLの逆転をあきらめます。 –

+0

ありがとう、これは私が探していたものです。私は2つの別々のURLが必要であることを知って驚いた。 – slypete

+9

ニースの答え。しかし、ちょっと落ち込んで... – Joe

1

がなぜ二つのパターンを持っていません2つの別々の名前付きURLパターン。

url(r'^so/(?P<required>\d+)/', include('myapp.required_urls')) 

をし、次いでrequired_urls.pyファイルを追加します:

url(r'^$', 'myapp.so', name='something') 
url(r'^(?P<optional>.+)/$', 'myapp.so', name='something_else') 

通常URLパターンの一部の繰り返しがあなたを気にした場合、それは()などが使用してそれを取り除くことが可能ですかなりの数のURL(確かに2つ以上のもの)に共通の接頭辞がないかぎり、私はこの価値は考慮しません。

+0

これらのURLパターンをどの順序で配置するかは関係ありません。どちらも最後に$で囲まれているため、あいまいさはありません。もちろん、それが重要な類似の状況があります(たとえば、短いパターンに制限がない場合など)。 –

+0

うーん。編集します。 – hughdbrown

5

その他でこれを処理する方法を実証しています

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='something'), 
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='something_else'), 
+0

Carlさん、ありがとうございます。 – slypete

+0

'pattern'を使って新しいファイルを作る必要がなくなります:' url(r '...'、include(patterns ''、url(...)、url(...))) '' 。 [こちらを参照](https://docs.djangoproject.com/en/dev/topics/http/urls/#including-other-urlconfs) – Patrick

-1

views.pyでは簡単なことをします。

def so(request, required, optional=None): 

そして、あなたは、URL文字列にオプションのparamを得るいけないとき、それはあなたのコード内でNoneになります。

シンプルでエレガントな:)

+0

Djangoのどのバージョンで動作しますか?私は1.5これはurl.pyの変更なしでは動作しません。 –

+0

これはviews.pyメソッドで機能します。そして、DjangoはURL管理とビューの適用に関して多くの変更を行って以来かなり下がっています。 [例えば。クラスベースのビュー]; – Popara

+0

あなたはdjangoでそれを行うことはできません。まず、 'url.py'を見てください。&urlに一致するパターンは見つかりません。これは 'views.py'内にあり、パターンが見つかるまで実行されません。 –

17

DjangoのURLは多型性:

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='sample_view'), 
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='sample_view'), 

そのobiousは、あなたがこのようなあなたの意見をしなければならないこと:

def sample_view(request, required, optional = None): 

ので、あなたがそれを呼び出すことができます同じ名前とそれは仕事のURLのリゾルバーはうまくいくだろう。しかし、あなたは必須の引数としてNoneを渡していないし、それは、引数なしで正規表現にあなたを取得することを期待傾けることに注意してください:

間違っ:

{% url sample_view required optional %} 

正しい:

{% if optional %} 
    {% url sample_view required optional %} 
{% else %} 
    {% url sample_view required %} 
{% endif %} 

これはどこに書かれているか分かりません - 私は偶然それを発見しました - 私はURLの名前を書き換えるのを忘れていましたが、とにかく働いていました:)

1

まだこの問題が発生している方にお勧めします。 私はDjango 1.5を使用しました(更新:1.8を使用)、それでも問題なく動作しています。

は、私が使用します。

url(r'^(?P<app_id>\d+)/start/+(?P<server_id>\d+)?', views.restart, name='restart') 

その後

urls.py私は2つのURLを持ちたいとき

/1/start/2 

/1/start 

私が使用します。

{% url '<namespace>:start' app.id %} 
{% url '<namespace>:start' app.id server.id %} 

これは、あなたが手動でURLを作成する場合は、あなたが心の中で/を維持したURL

/1/start/2 and 
/1/start/ <- notice the slash. 

を作成します。

私はフープこれは誰にも役立ちます!

-2

あなたのユースケースに応じて、あなたは、単にそのようなURLパラメータ渡しすることもできます。あなたのビューで

url/?parameter=foo 

コールこの:

request.REQUEST.get('parameter') 

これは

を 'foo' を返しますが
+0

私の質問は、オプションのパラメータをview関数に渡し、URLテンプレートタグとともに使用することでした。 – slypete

関連する問題