Тестирование пользовательских действий администратора в django
Я новичок в django, и у меня возникли проблемы с тестированием пользовательских действий (например, actions = ['mark_as_read']), которые находятся в раскрывающемся списке app_model_changelist, это же выпадающее меню со стандартным удалением. Пользовательские действия работают в представлении администратора, но я просто не знаю, как назвать это в моем макетном запросе, я знаю, что мне нужно публиковать данные, но как сказать, что мне нужно выполнить действие "mark_as_read" по данным, которые я опубликовал?
Я хочу изменить список изменений и отправить запрос, чтобы функция действия "mark_as_read" обработала данные, которые я опубликовал.
change_url = urlresolvers.reverse('admin:app_model_changelist')
response = client.post(change_url, <QuerySet>)
Ответы
Ответ 1
Просто передайте параметр action
с именем действия.
response = client.post(change_url, {'action': 'mark_as_read', ...})
Проверяемые элементы передаются как параметр _selected_action
. Таким образом, код будет выглядеть так:
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)
Ответ 2
Вот что я делаю:
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)
Несколько замечаний по этому поводу, по сравнению с принятым ответом:
- Мы можем использовать
values_list
вместо понимания списка, чтобы получить идентификаторы. - Нам нужно указать
follow=True
потому что ожидается, что успешная публикация приведет к перенаправлению - Необязательно утверждать для успешного сообщения
- Убедитесь, что изменения действительно отражены на db.