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)