2017-01-13 6 views
1

私は以下のようにURLに引数(フォームフィールド値)を渡したかったのです。私はこれを行うときには、それは私が私が中にこの問題を解決するか、私にHttpResponseRedirectにform_cleaned値を渡すための代替的なアプローチを示唆して助けいただければ幸いエラーDjango/python:form.cleaned_dataの値をHttpResponseRedirectに引数として渡すには?

ないフォーマット文字列のための十分な引数

を発生させます。

def phone(request): 
    form = PhoneForm(request.POST or None) 
    if form.is_valid(): 

     instance = form.save(commit=False) 
     Phone = form.cleaned_data.get('Phone') 
     instance.save() 
     form.save() 
     return HttpResponseRedirect('http://send_sms.com/api_key=api&to=%s&message=Welcome%20to%messaging' %Phone) 

    context = { 
    "form": form, 
    } 
    return render(request, "phone.html", context) 

答えて

2

問題は、Pythonが文字列の他の%記号をプレースホルダとして扱っていることです。

他のパーセント記号(例:Welcome%%20)をダブルアップするか、.format(Phone)を使用することができますが、より安全な方法は、Pythonでクエリ文字列をエンコードすることです。

from urllib.parse import urlencode # Python 3 
# from urllib import urlencode # Python 2 

query = { 
    'api_key': 'api', 
    'to': Phone, 
    'message': 'Welcome to messaging', 
} 
url = 'http://send_sms.com/?%s' % urlencode(query) 
return HttpResponseRedirect(url) 

これはうまくいきなり読みやすくなり、間違いの可能性が低くなります。たとえば、あなたの質問で%20の代わりに%%messagingにあります。

1

試しましたか?

from urllib.parse import urlencode # Python 3 
# from urllib import urlencode # Python 2 

def phone(request): 
    form = PhoneForm(request.POST or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     argument = form.cleaned_data.get('Phone') 
     instance.save() 
     # form.save() -- redundant here imho 
     return HttpResponseRedirect(
     'http://send_sms.com/api_key=api&to={}&message=Welcome%20to%messaging'.format(urlencode(argument)) 
     ) 

    context = { 
     "form": form, 
    } 
    return render(request, "phone.html", context) 

文字列の置換に古い形式が使用されています。 また、form.saveはフォームがインスタンスなので、instance.save()で十分です。

+0

インスタンスを保存する前に何もしないので、 'commit = False'で保存する必要はありません。フォームを保存するために 'instance = form.save()'を実行すると、SMSの番号を取得する 'Phone = form.cleaned_data.get( 'Phone')'で十分です。 – Alasdair

+1

@Alasdair私は知っているが、おそらく著者は何かをしたいと思った) –

1

あなたは代わりにこのフォーマットをやってみてください:

return HttpResponseRedirect('http://send_sms.com/api_key=api&to={}&message=Welcome%20to%messaging'.format(Phone)) 

使用している文字列置換が時代遅れになってきています。これは長期的な解決策としてはより良いアプローチかもしれません。

関連する問題