20

多数のフィールドと 20000 以上のテーブル行を持つ Django モデルがあります。人間が読める URL と、大きなリストを任意のサブリストに分割する機能を容易にするために、次のような URL が必要です。

/browse/<name1>/<value1>/<name2>/<value2>/ .... etc ....

ここで、「名前」はモデル属性にマップされ、「値」はその属性の検索基準です。各「名前」はカテゴリのように扱われ、カテゴリが一致するモデル インスタンスのサブセットが返されます。

現在、これは GET パラメーターで処理できますが、ユーザーと検索エンジンの両方のために、より読みやすい URL を好みます。これらの URL サブセットは、このモデルを表示する各ページに埋め込まれます。

name1理想的には、それぞれの名前と値のペアが、などの名前のパラメーターとしてビュー関数に渡されますname2。ただし、正規表現の一致したテキストを介して名前付きパターンを定義することはできないと思います。私は間違っていますか?

だから、私はこのようなことをする必要があるようです:

urlpatterns = patterns('',
    url(r'^browse/(?:([\w]+)/([\w]+)/)+$', 'app.views.view', name="model_browse"),
)

これは、2 つの名前と値のペアの任意のセットと一致するはずです。それは正常に照合されますが、最後の名前と値のペアのみがパラメータとしてビュー関数に渡されます。私の推測では、各一致が前の一致を上書きしていると思います。(?:...)+ を含むことが原因であるという推測の下で、代わりに単純な繰り返しパターンを試しました。

urlpatterns = patterns('',
    url(r'^browse/([\w]+/)+$', 'app.views.view', name="model_browse"),
)

...同じ問題が発生しましたが、今回*argsは最後に一致したパターンのみが含まれています。

これは、Django の URL ディスパッチャーや Python の正規表現サポートの制限ですか? これらの方法のいずれかが機能するはずです。オプションの (.*) パターンとして URL に可能な各モデル属性をハードコーディングせずにこれを実現する方法はありますか?

4

5 に答える 5

15

考えられる可能性は、URL パターン部分内の可能な値の文字列全体を照合し、ビュー内の特定の部分を引き出すことです。例として:

urlpatterns = patterns('',
    url(r'^browse/(?P<match>.+)/$', 'app.views.view', name='model_browse'),
)

def view(request, match):
    pieces = match.split('/')
    # even indexed pieces are the names, odd are values
    ...

私が使用した正規表現についての約束はありませんが、私の言いたいことは理解できたと思います。

(正規表現を試して修正するために編集されました。)

于 2008-10-30T07:52:30.773 に答える
3

私はアダムに同意しますが、urls.py のパターンは次のようにする必要があると思います。

... r'^browse/(?P<match>.+)/$' ...

「\w」は「単語」文字のみに一致しますが、「.」には一致しません。何にでも合います。

于 2008-10-30T18:32:46.503 に答える
0

以前とまったく変わらないが、より洗練された代替ソリューションがあります。

url(r'^my_app/(((list\/)((\w{1,})\/(\w{1,})\/(\w{1,3})\/){1,10})+)$'

名前のない URL パラメータと反復的な正規表現を使用しました。「有効な正規表現ではありません: 複数の繰り返し」を取得しないように、リストの先頭に単語を配置します。

私はまだリストを受け取るビューで作業しています。しかし、私は args や kwargs を通過するのは間違っていると思います.. まだ正確に言うことはできません。

私の2セント

于 2016-02-23T10:37:31.333 に答える
0

質問を読んでいるときに同じ答えが私に来ました。

model_browse ビューは、クエリ パラメータを並べ替えて汎用ルーターとして使用するための最良の方法だと思います。

于 2008-10-31T23:31:03.497 に答える
0

Adam の回答は私の解決策よりも一般的だと思いますが、URL で一定数の引数を使用したい場合は、次のようにすることもできます。

次の例は、 、、storeおよびの名前を入力して、ある場所の 1 日のすべての売上を取得する方法を示しています。yearmonthday

urls.py :

urlpatterns = patterns('',
    url(r'^baseurl/location/(?P<store>.+)/sales/(?P<year>[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9])/$', views.DailySalesAtLocationListAPIView.as_view(), name='daily-sales-at-location'),
)

(?P<store>.+)または、 に変更してストアの ID を使用することもできます(?P<store>[0-9]+)locationandsalesはキーワードではなく、URL の読みやすさを向上させるだけであることに注意してください。

ビュー.py

class DailySalesAtLocationListAPIView(generics.ListAPIView):
    def get(self, request, store, year, month, day):
        # here you can start using the values from the url
        print store
        print year
        print month
        print date

        # now start filtering your model

誰にも役立つことを願っています!

よろしくお願いします、

マイケル

于 2013-10-15T10:15:03.790 に答える