with tutorial site framework fra espaƱol applications django testing request action admin

tutorial - Probando acciones de administrador personalizadas en django.



framework django python (3)

Soy nuevo en django y tengo problemas para probar acciones personalizadas (por ejemplo, acciones = [''mark_as_read'']) que están en el menú desplegable en app_model_changelist, es el mismo menú desplegable con el estándar "eliminar seleccionado". Las acciones personalizadas funcionan en la vista de administrador, pero no sé cómo llamarlas en mi solicitud simulada. Sé que necesito publicar datos, pero ¿cómo decir que quiero que se realice la acción "mark_as_read" en los datos que publiqué?

Quiero invertir la URL de la lista de cambios y publicar el queryset para que la función de acción "mark_as_read" procese los datos que publiqué.

change_url = urlresolvers.reverse(''admin:app_model_changelist'') response = client.post(change_url, <QuerySet>)


Aquí es cómo lo hace con inicio de sesión y todo, un caso de prueba completo:

from django.test import TestCase from django.urls import reverse from content_app.models import Content class ContentModelAdminTests(TestCase): def setUp(self): # Create some object to perform the action on self.content = Content.objects.create(titles=''{"main": "test tile", "seo": "test seo"}'') # Create auth user for views using api request factory self.username = ''content_tester'' self.password = ''goldenstandard'' self.user = User.objects.create_superuser(self.username, ''[email protected]'', self.password) def shortDescription(self): return None def test_actions1(self): """ Testing export_as_json action App is content_app, model is content modify as per your app/model """ data = {''action'': ''export_as_json'', ''_selected_action'': [self.content._id, ]} change_url = reverse(''admin:content_app_content_changelist'') self.client.login(username=self.username, password=self.password) response = self.client.post(change_url, data) self.client.logout() self.assertEqual(response.status_code, 200)

Solo modifique para usar su modelo y acción personalizada y ejecute su prueba.

ACTUALIZACIÓN: Si obtiene un 302, es posible que deba usar follow=True en self.client.post() .


Esto es lo que hago:

data = {''action'': ''mark_as_read'', ''_selected_action'': Node.objects.filter(...).values_list(''pk'', flat=True)} response = self.client.post(reverse(change_url), data, follow=True) self.assertContains(response, "blah blah...") self.assertEqual(Node.objects.filter(field_to_check=..., pk__in=data[''_selected_action'']).count(), 0)

Unas pocas notas sobre eso, en comparación con la respuesta aceptada:

  • Podemos usar values_list lugar de la lista de comprensión para obtener los ID.
  • Necesitamos especificar follow=True porque se espera que una publicación exitosa lleve a una redirección
  • Opcionalmente afirmar para un mensaje exitoso
  • Compruebe que los cambios se reflejen en la db.

Simplemente pase la action del parámetro con el nombre de la acción.

response = client.post(change_url, {''action'': ''mark_as_read'', ...})

Los elementos _selected_action se pasan como el parámetro _selected_action . Entonces el código será así:

fixtures = [MyModel.objects.create(read=False), MyModel.objects.create(read=True)] should_be_untouched = MyModel.objects.create(read=False) #note the unicode() call below data = {''action'': ''mark_as_read'', ''_selected_action'': [unicode(f.pk) for f in fixtures]} response = client.post(change_url, data)