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() было бы достаточно.

Другие вопросы по тегам