我正在使用 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>
一些有用的参考资料: