1

私は、多くの異なる変数を取る「野生の」フォームを持っています-それは入力されている場合とされていない場合があります。

   try:
        app_version = request.REQUEST["appVersion"]
    except:
        app_version = ''

    try:
        app_name = request.REQUEST["appName"]
    except:
        app_name = ''

    try:
        app_code_name = request.REQUEST["appCodeName"]
    except:
        app_code_name = ''

これを達成するためのより厳密な方法はありますか?

4

3 に答える 3

11
app_version = request.REQUEST.get("appVersion", "")

get(key, default)Python で実装されたメソッドですdicts。キーがディクショナリに存在する場合、その値が返されます。キーが存在しない場合は、指定されたデフォルト値が返されます。Django では、requestオブジェクトは辞書のようなオブジェクトなので、getも同じ方法で定義されます。

于 2009-07-16T21:29:30.357 に答える
8

これらの変数がフォームへの入力を目的としている場合は、request.POSTオブジェクトをフォーム コンストラクターに直接安全に渡すことができます。

if request.method == 'POST':
    form = MyForm(request.POST)

フォームは自動的に正しい値を正しいフォーム フィールドに渡し、存在しないキーにはデフォルトを使用し、欠落しているキーには空白のフィールドを作成します (補遺を参照)。

フォームを処理しようとしている場合は、上記のようにフォーム オブジェクトを作成し、そのオブジェクトから値を読み取ることをお勧めします。

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
        # You may process these variables here
        print form.appVersion
        print form.appName
        print form.appCodeName

検証コードもフォーム クラスに配置するのが最適です。そうすれば、form.is_valid()が返さTrueれた場合、操作するクリーンなデータセットがあることがわかります。

注: Django のドキュメントでは、より明示的であるため、 amalgamated variable ではなくrequest.POSTorを直接使用することをお勧めしています。request.GETrequest.REQUEST

補遺:

この場合、バインドされたフォームとバインドされていないフォームの違いを理解することが重要です。でバインドされていないフォームを作成するとform = MyForm()、フォームがインスタンス化されるときに、すべてのフィールドinitialに各フィールドのプロパティが入力されます (存在する場合)。たとえば、次のコードを使用します。

from django import forms

class MyForm(forms.Form):
    appVersion = forms.CharField(initial='1.0')
    appName = forms.CharField()
    appCodeName = forms.CharField()

フォームは、値が「1.0」の appVersion で初期化されます。ただし、 POST リクエストを次のようなフォームにバインドするとform = MyForm(request.POST)、初期プロパティは無視されます。つまり、POST dict に appVersion キーが含まれていない場合、そのフィールドは空白のままになります。フィールドが必須でない限り、フォームは引き続き検証form.appVersionされ、検証後にビューで変更できます。

于 2009-07-16T21:50:34.260 に答える
6

多くのフィールドがある場合、よりコンパクトなバージョンは次のようになります。

defaults = { 'field1' : 'val1', 'field2' : 'val2', ...}
defaults.update(request.POST)
于 2009-07-16T22:01:52.707 に答える