使用 pytest 在 Django Admin 中测试 delete_selected 操作

问题描述

我使用的是 Django 3.2b1 和 pytest 6.2.2。

我正在尝试使用 pytest 编写测试以确保管理员能够使用 delete_selected 操作删除对象。我的测试如下:

def test_delete_mymodel_action(admin_client):
    objs_to_delete = [
        MyModel.objects.create(),MyModel.objects.create(),]
    MyModel.objects.create() # Don't delete this obj

    data = {
        "action": "delete_selected","_selected_action": [str(f.pk) for f in objs_to_delete],"post": "yes",# Skip the confirmation page
    }
    change_url = reverse("admin:myapp_mymodel_changelist")
    admin_client.post(change_url,data)

    assert MyModel.objects.count() == 1

代码有效并以 302 重定向返回更改列表结束,但对象不会被删除。回复是:

test_delete_mymodel_action - assert 3 == 1

我对此进行测试的原因是某些代码会导致 delete_selected 操作失败。例如,如果您覆盖 get_queryset() 中的 ModelAdmin 并返回使用 distinct() 的查询集,delete_selected 操作将失败。

这里是 Django Admin 中删除确认页面的代码:

<form method="post">
    <input type="hidden" name="csrfmiddlewaretoken" value="VCR7vjVYcb2xuMdPUknotrealViwj92wgZrT21k6RbqGxXNlQnCORU1Fp6NzKhn64">
    <div>
        <input type="hidden" name="_selected_action" value="31418">
        <input type="hidden" name="_selected_action" value="31412">
        <input type="hidden" name="action" value="delete_selected">
        <input type="hidden" name="post" value="yes">
        <input type="submit" value="Yes,I’m sure">
        <a href="#" class="button cancel-link">No,take me back</a>
    </div>
</form>

一些有用的参考资料:

  1. Django's delete_selected() method.
  2. Testing custom admin actions in django SO Answer

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)