Django/python: как передать значение form.cleaned_data в HttpResponseRedirect в качестве аргумента?
Я хотел передать аргумент (значение поля формы) в URL, как показано ниже. Но когда я делаю это, возникает ошибка
недостаточно аргументов для форматной строки
Я был бы признателен, чтобы помочь мне решить эту проблему или предложить мне альтернативный подход для передачи значения form_cleaned в 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)
3 ответа
Проблема в том, что 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
,
Вы можете попробовать сделать этот формат вместо этого:
return HttpResponseRedirect('http://send_sms.com/api_key=api&to={}&message=Welcome%20to%messaging'.format(Phone))
Подстановка строк, которую вы используете, становится устаревшей. Это может быть лучшим подходом для долгосрочных решений.
Вы пробовали это?
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()
было бы достаточно.