2017-01-13 2 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

문제는 파이썬이 문자열에서 다른 % 표지를 자리 표시 자로 처리한다는 것입니다.

다른 백분율 기호 (예 : Welcome%%20)를 두 번 사용하거나 .format(Phone)을 사용할 수 있지만 더 안전한 방법은 파이썬에서 쿼리 문자열 인코딩을 처리하는 것입니다.

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) 

문자열 대체에 오래된 형식을 사용하고 있습니다. 또한 양식이 인스턴스이기 때문에 이 필요하지 않으므로 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)) 

사용하고있는 문자열 대체 오래된되고있다. 이는 장기적인 솔루션에 대한 더 나은 접근 방법 일 수 있습니다.