Django/python:如何将form.u数据值作为参数传递给HttpResponseRedirect?

Django/python:如何将form.u数据值作为参数传递给HttpResponseRedirect?,python,django,django-forms,django-views,cleaned-data,Python,Django,Django Forms,Django Views,Cleaned Data,我想在URL中传递一个参数(表单字段值),如下所示。但当我这样做时,它会引发一个错误 格式字符串的参数不足 如果您能帮助我解决这个问题,或者建议我将表单清理值传递给HttpResponseRedirect的替代方法,我将不胜感激 def phone(request): form = PhoneForm(request.POST or None) if form.is_valid(): instance = form.save(commit=False)

我想在URL中传递一个参数(表单字段值),如下所示。但当我这样做时,它会引发一个错误

格式字符串的参数不足

如果您能帮助我解决这个问题,或者建议我将表单清理值传递给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)
你试过这个吗

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()
就足够了。

你试过这个吗

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()
就足够了。

您可以尝试使用这种格式:

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

您正在使用的字符串替换已过时。对于长期解决方案,这可能是一种更好的方法。

您可以尝试使用以下格式:

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

您正在使用的字符串替换已过时。这可能是一种更好的长期解决方案。

问题在于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)

希望这更具可读性,并减少出错的机会。例如,在您的问题中,您在
%messaging
中使用了
%
而不是
%20
。问题是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)

希望这更具可读性,并减少出错的机会。例如,在您的问题中,您在
%messaging

中使用了
%
而不是
%20
,因为在保存实例之前您没有对其执行任何操作,所以根本不需要使用
提交=False
进行保存。执行
instance=form.save()
保存表单,然后执行
Phone=form.cleaned\u data.get('Phone')
获取短信号码就足够了。@Alasdair我知道,但可能作者想做点什么)因为在保存实例之前,您不需要对其执行任何操作,所以根本不需要使用
commit=False
进行保存。执行
instance=form.save()
保存表单,然后执行
Phone=form.cleaned\u data.get('Phone')
获取短信号码就足够了。@Alasdair我知道,但可能作者想做点什么)