3

既製のフォーム (つまり、django.Forms.form検証済みのバインドされたデータから派生したクラスのオブジェクト) を取得し、GET で送信されたかのようにそれを urlencode したいと考えています。組み込みの方法はありますか?

なぜ私がこの質問をするのか、なぜ単に を呼び出すことができないのかを示すために、これからurlencodeの出力は " " になるはずbox=onです。

from django import forms
from urllib import urlencode


class DemoForm(forms.Form):
    box = forms.BooleanField(required=False)

instance = DemoForm({"box": True})  # it's irrelevant how this data is supplied
instance.is_valid()
print "encoded:", urlencode(instance.cleaned_data)

実際には " box=True" です。これurlencodeは、形式をエンコードしていないため、クリーンな値をエンコードしているためです (信じてください、BooleanFieldこれが最も単純なケースです)。

そこで、フォームを GET 文字列であるかのようにエンコードする方法を求めています。正しい GET 文字列。

4

2 に答える 2

4

フォームの clean_data で urllib の urlencode を呼び出すと、次の 2 つのケースではうまく機能しません。

  • ModelChoiceField を使用している場合、cleaned_data には ID ではなく実際のオブジェクトが含まれます。これらは主キーの代わりに文字列表現に urlencode() します。
  • 複数の値を保持できるフィールド (MultiValueField、MultipleChoiceField など) を使用している場合、urlencode() はそのフィールドから 1 つを除くすべての値を失います。したがって、 {'mykey':[1,2,3]} は、django のように ?mykey=1&mykey=2&mykey=3 ではなく ?mykey=3 になります。

これらの問題の両方に対処するには、フォームの組み込みの urlencode 関数を使用します。

form = MyForm(request.POST) #or a dict or whatever
form.is_valid()
querystring = form.data.urlencode() 

これは、cleaned_data ではなく data に対して呼び出されることに注意してください。検証の一環としてフォームの値が変更された場合、それらの変更はここには反映されません。

于 2013-12-12T05:54:22.247 に答える
2

通常、フォームには値が関連付けられていないため、既製のフォームの意味がよくわかりません。それとも、ユーザーが入力したフォームを受け取り、それを get として投稿するつもりですか?

urllibs エンコードを使用して get-string を作成できます。

import urllib

print urllib.urlencode({'key1': 'value1', 'key2': 'value2'})
# key1=value1&key2=value2

投稿されたフォームを取得して、このデータから GET 文字列を作成する場合:

form = MyForm(request.POST)
if form.is_valid():
    print urllib.urlencode(form.cleaned_data)
    # name=value&name=value etc

バインドされていないフォームの GET を作成する場合:

# this form contains intitial values
# which are shown when printing the form
form = MyForm()
print urllib.urlencode(form.initial)
# name=value&name=value etc
于 2013-01-14T20:29:17.533 に答える