Pregunta

Me gustaría poder enviar un formulario en una fuente HTML (cadena) . En otras palabras, necesito al menos la capacidad de generar parámetros POST a partir de una cadena que contiene la fuente HTML del formulario . Esto es necesario en pruebas unitarias para un proyecto Django. Me gustaría una solución que posiblemente;

  • Utiliza solo la biblioteca estándar de Python y Django.
  • Permite la generación de parámetros desde un formulario específico si hay más de un formulario presente.
  • Me permite cambiar los valores antes del envío.

Una solución que devuelve una instancia de formulario (Django) de una clase de formulario dada es la mejor. Porque me permitiría usar la validación. Idealmente, consumiría la fuente (que es una cadena), una clase de formulario y, opcionalmente, un nombre de formulario y devolvería la instancia como estaba antes de la representación.

NOTA: Soy consciente de que esta no es una tarea fácil, y probablemente las ganancias difícilmente justifiquen el esfuerzo necesario. Pero tengo curiosidad acerca de cómo se puede hacer esto, de una manera práctica y confiable. Si es posible.

¿Fue útil?

Solución

Debe volver a leer la documentación sobre el marco de pruebas de Django , específicamente la parte sobre probar vistas (y formularios) con el cliente de prueba .

El cliente de prueba actúa como un simple navegador web y le permite realizar solicitudes GET y POST a sus vistas de Django. Puede leer el HTML de respuesta u obtener el mismo objeto Context que recibió la plantilla. Su objeto Context debe contener la instancia real de form.Form que está buscando.

Como ejemplo, si su vista en la URL / form / pasa el contexto {'myform': forms.Form ()} a la plantilla, podría ve de esta manera:

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)

Esperemos que eso logre lo que desea, sin tener que meterse con el análisis de HTML.

Editar : después de volver a leer los documentos de Django sobre formularios, resulta que los formularios son inmutables. Sin embargo, está bien, solo cree una nueva instancia de Formulario y envíela; He cambiado mi ejemplo de código para que coincida con esto.

Otros consejos

Dado que el marco de prueba de Django hace esto, no estoy seguro de lo que está preguntando.

¿Desea probar una aplicación de Django que tiene un formulario?

  • En cuyo caso, debe hacer un GET inicial
  • seguido de la POST resultante

¿Desea escribir (y probar) una aplicación de Django que envíe un formulario a otro sitio?

Así es como probamos las aplicaciones de Django con formularios.

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")

Nota: no analizamos el HTML en detalle. Si tiene la plantilla correcta y la cadena de respuesta correcta, debe ser correcta.

Es simple ... y difícil al mismo tiempo.
Descargo de responsabilidad: no sé mucho sobre Python y nada sobre Django ... Así que doy consejos generales, independientes del lenguaje ... Si uno de los consejos anteriores no funciona para usted, puede hacerlo manualmente:

  • Cargue la página con un analizador HTML, enumere los formularios.
  • Si el atributo method es POST (no distingue entre mayúsculas y minúsculas), obtenga el atributo action para obtener la URL de la solicitud (puede ser relativo).
  • En el formulario, obtenga todas las etiquetas input y select . Los atributos name (o id si no name) son las claves de los parámetros de la solicitud. Los atributos value (vacíos si están ausentes) son los valores correspondientes.
  • Para select , el valor es el de la opción seleccionada o el texto mostrado no es un atributo value .

Estos nombres y valores deben estar codificados en URL en las solicitudes GET, pero no en las POST.

HTH.

Echa un vistazo a mecanizar o es el contenedor sarga . Creo que es ClientForm el módulo funcionará para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top