HTML 소스 만 주어진 양식을 어떻게 제출합니까?
-
19-08-2019 - |
문제
나는 양식을 제출할 수 있기를 원합니다. HTML 소스 (String). 다시 말해 최소한 우편 매개 변수를 생성 할 수있는 기능이 필요합니다. 양식의 HTML 소스를 포함하는 문자열에서. 이것은 Django 프로젝트의 단위 테스트에서 필요합니다. 나는 아마도 솔루션을 원합니다.
- 표준 Python 라이브러리 및 Django 만 사용합니다.
- 둘 이상의 양식이있는 경우 특정 양식에서 매개 변수 생성을 허용합니다.
- 제출하기 전에 값을 변경할 수 있습니다.
주어진 양식 클래스에서 a (django) 양식 인스턴스를 반환하는 솔루션이 가장 좋습니다. 유효성 검사를 사용할 수 있기 때문입니다. 이상적으로는 소스 (문자열), 양식 클래스, 선택적으로 형식 이름을 소비하고 렌더링 전과 같이 인스턴스를 반환합니다.
참고 : 나는 이것이 쉬운 일이 아니라는 것을 알고 있으며, 아마도 이익은 필요한 노력을 거의 정당화 할 수 없을 것입니다. 그러나 나는 이것이 실용적이고 신뢰할 수있는 방식으로 어떻게 할 수 있는지 궁금합니다. 가능하다면.
해결책
다시 읽어야합니다 Django의 테스트 프레임 워크에 대한 문서, 특히 뷰 테스트 (및 형태)에 대한 부분 테스트 클라이언트.
테스트 클라이언트는 간단한 웹 브라우저 역할을하며 GET
그리고 POST
Django 조회수 요청. 응답 HTML을 읽거나 동일하게 얻을 수 있습니다. Context
템플릿을 수신 한 금액. 당신의 Context
객체에는 실제가 포함되어야합니다 forms.Form
찾고있는 인스턴스입니다.
예를 들어, URL에서의보기가 /form/
컨텍스트를 통과합니다 {'myform': forms.Form()}
템플릿에 이런 식으로 얻을 수 있습니다.
from django.test.client import Client
c = Client()
# request the web page:
response = c.get('/form/')
# get the Form object:
form = response.context['myform']
form_data = form.cleaned_data
my_form_data = {} # put your filled-out data in here...
form_data.update(my_form_data)
# submit the form back to the web page:
new_form = forms.Form(form_data)
if new_form.is_valid():
c.post('/form/', new_form.cleaned_data)
바라건대 그것은 HTML을 엉망으로 만들지 않고 원하는 것을 달성하기를 바랍니다.
편집하다: Django 문서를 형태에 대해 다시 읽은 후에는 형태가 불변이라는 것이 밝혀졌습니다. 그래도 괜찮아요. Form
인스턴스 및 제출; 코드 예제를 변경하여 이에 맞게 변경했습니다.
다른 팁
Django 테스트 프레임 워크가이를 수행하기 때문에, 당신이 무엇을 요구하는지 잘 모르겠습니다.
양식이있는 Django 앱을 테스트 하시겠습니까?
- 이 경우 초기 GET을 수행해야합니다.
- 결과 게시물이 뒤 따릅니다
다른 사이트에 양식을 제출하는 Django 앱을 작성하고 테스트하고 싶습니까?
다음은 양식으로 django 앱을 테스트하는 방법입니다.
class Test_HTML_Change_User( django.test.TestCase ):
fixtures = [ 'auth.json', 'someApp.json' ]
def test_chg_user_1( self ):
self.client.login( username='this', password='this' )
response= self.client.get( "/support/html/user/2/change/" )
self.assertEquals( 200, response.status_code )
self.assertTemplateUsed( response, "someApp/user.html")
def test_chg_user( self ):
self.client.login( username='this', password='this' )
# The truly fussy would redo the test_chg_user_1 test here
response= self.client.post(
"/support/html/user/2/change/",
{'web_services': 'P',
'username':'olduser',
'first_name':'asdf',
'last_name':'asdf',
'email':'asdf@asdf.com',
'password1':'passw0rd',
'password2':'passw0rd',} )
self.assertRedirects(response, "/support/html/user/2/" )
response= self.client.get( "/support/html/user/2/" )
self.assertContains( response, "<h2>Users: Details for", status_code=200 )
self.assertContains( response, "olduser" )
self.assertTemplateUsed( response, "someApp/user_detail.html")
참고 - HTML을 자세히 구문 분석하지 않습니다. 올바른 템플릿이 있고 올바른 응답 문자열이있는 경우 올바른 것이 좋습니다.
간단하고 동시에 힘들다.
면책 조항 : 나는 Python에 대해 많이 알지 못하고 Django에 대해 전혀 모른다 ... 그래서 나는 일반적인 언어 불가지론적인 조언을 제공합니다 ... 위의 조언 중 하나가 당신에게 효과가 없다면, 당신은 수동으로 그것을하고 싶을 것입니다. :
- HTML 파서로 페이지를로드하고 양식을 나열하십시오.
- 만약
method
속성은 POST (Case Insensitive)입니다.action
요청의 URL을 얻는 속성 (상대적 일 수 있음). - 형식으로 모든 것을 얻으십시오
input
그리고select
태그. 그만큼name
(또는id
이름) 속성이없는 경우 요청 매개 변수의 키입니다. 그만큼value
속성 (결석이없는 경우 비어 있음)은 해당 값입니다. - 을 위한
select
, 값은 선택된 것 중 하나입니다option
또는 표시된 텍스트는 아니오입니다value
기인하다.
이러한 이름과 값은 GET 요청에서 인코딩되어야하지만 게시물에는 URL이어야합니다.
HTH.
체크 아웃 기계화 또는 포장지입니다 능직. 나는 그것이 생각합니다 ClientForm 모듈이 당신을 위해 작동합니다.