Тестирование пользовательских действий администратора в 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.