web-dev-qa-db-ja.com

Django整数のURLパターン

PythonとDjangoは初めてです。URLPatternをurls.pyに次のように追加しました:

    url(r'^address_edit/(\d)/$', views.address_edit, name = "address_edit"),

URLに可変長の整数のパラメータを受け入れてほしい。データベーステーブルの「id」の場合は0、100、1000、99999。ただし、上記のパターンでは1桁しか受け入れないことがわかりました。 1桁だけではなく整数(例:999999)を渡すと、エラーが表示されます

Reverse for 'address_edit' with arguments '(9999999,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['address_book/address_edit/(\\d)/$']

プログラムがURLから任意の数の整数を受け入れることができるURLパターンを構築するにはどうすればよいですか?

9
user2114189

正規表現には、次のような+修飾子が必要です。

^address_edit/(\d+)/$

Pythonの正規表現ドキュメント からの引用、

'+'

結果のREを前のREの1回以上の繰り返しと一致させます。 ab+aと一致し、その後にゼロ以外の数のbsが続きます。 aだけでは一致しません。

\dは任意の数字(0-9)と一致します。しかし、それは一度だけ一致します。 2回一致させるには、\d\dを実行します。ただし、受け入れる桁数が増えると、\dsの数を増やす必要があります。しかし、正規表現にはそれを行うためのより簡単な方法があります。受け入れる桁数がわかっている場合は、次のことができます。

\d{3}

これは、3つの連続した数字を受け入れます。 3〜5桁を受け入れたい場合はどうなりますか? RegExはそれをカバーしています。

\d{3,5}

簡単ですね:)現在、3〜5桁の数字のみを受け入れます(注:3未満のものも一致しません)。ここで、最小の1桁を確認する必要がありますが、最大は何でもかまいません。あなたならどうしますか?このように、範囲をオープンエンドのままにしてください

\d{3,}

これで、RegExエンジンは最小3桁に一致し、最大は任意の数になります。最小の1桁を一致させ、最大を任意の数にすることができる場合は、どうしますか

\d{1,}

正解:)これでも機能します。しかし、同じことを行うための省略表記+があります。ドキュメントに記載されているように、ゼロ以外の桁数と一致します。

23
thefourtheye

Django> = 2.0バージョンでは、これは以下のようによりクリーンでシンプルな方法で行われます。

from Django.urls import path

from . import views

urlpatterns = [
    ...
    path('address_edit/<int:id>/', views.address_edit, name = "address_edit"),
    ...
]
14
SuperNova