我如何提交形式只给予的HTML源?
-
19-08-2019 - |
题
我希望能够提交一形式中的一个 HTML源(string).换句话说,我至少需要的能力产生后参数 从一个包含的HTML源的形式.这是需要在单元的测试用于一个Django项目。我想一个解决方案,可能的话;
- 使用的唯一标准蟒蛇图书馆和Django。
- 允许参数产生从特定形式,如果存在多种形式存在。
- 允许我改变的价值观之前提交。
一个解决方案,返回(Django)的形式实例,从一定形式的类是最好的。因为这将允许我使用验证。理想的是,它将消耗本来源(这是a string),一种形式课和任选一种形式的名称和返回的实例,因为它是以前呈现。
注:我知道这不是一项容易的任务,和可能的收益将很难辩解的努力需要。但我只是好奇怎么这是可以做到的,在一个实际和可靠的方式。如果可能的。
解决方案
你应该重新读的 文件有关决的测试框架, 具体部分有关测试的意见(和形式)与 的测试的客户.
的测试的客户行为作为一个简单的网络浏览器,并且让你做 GET
和 POST
请求您的决景。你可以阅读响应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 docs约的形式,事实证明,形式是不可变的。这是好的,但是,只要创建一个新的 Form
实例和提交;我已经改变了我的码的例子匹配这一点。
其他提示
由于Django测试框架这样做,我不知道你是什么要求。
你想测试一个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详细说明。如果有合适的模板,并有权应string,它是正确的。
它是简单的...并努力在同一时间。
免责声明:我不知道很多关于蟒蛇并没有在所有有关决...所以我给大、语言无关的建议...如果一个以上的建议不为你工作,你可能要做手动:
- 载的网页有一个HTML分析器,清单的形式。
- 如果的
method
属性员额(不敏感情况下),得到的action
属性,获得网址的请求(可以相对)。 - 在形式,得到所有
input
和select
标记。的name
(或id
如果没有名称的)属性是关键的请求的参数。的value
属性(如果空缺席)的相应的价值。 - 对于
select
, ,值是一个选择的option
或者所显示的文字是没有value
属性。
这些名称和价值观必须URL encoded在得到请求,但不在员额的人。
禾田.
检查了 机械化 或者是包装纸 斜纹.我认为这是 ClientForm 模块将会为你工作。