不涉及request.POST.getlist的Django admin中间页面的_selected_action设置的正确方法是什么?

d33*_*tah 4 python django django-admin

我刚刚测试我的中间管理页面并意识到我遇到了bug 15742。以下评论似乎表明我的代码是错误的:

\n\n
\n

这里的问题涉及如何将“查询集”从原始操作处理程序保留到处理中间页面的 POST 的代码。在引用的博客文章中,这样做是这样的:

\n\n
if not form:\n    form = self.AddTagForm(initial={\'_selected_action\': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})\n
Run Code Online (Sandbox Code Playgroud)\n\n

此代码实际上并未使用传递到操作函数中的查询集参数,而是使用发布数据中所选操作复选框的列表,该列表仅是单个页面上的 100 个复选框。操作代码应该使用传递的 queryset\n 参数,该参数包含所有项目的完整列表,而不是\n 此发布数据。然而,Django 的文档目前显示了\xe2\x80\x8be正是这种使用 POST 数据的技术,并且应该修复该问题。

\n
\n\n

那么,什么是不涉及的正确方法request.POST.getlist呢?这是我的 apply_regex 现在的样子:

\n\n
# apply_regex.py\nfrom django import forms\nfrom django.shortcuts import render\nfrom django.http import HttpResponseRedirect\nfrom django.contrib.admin.helpers import ACTION_CHECKBOX_NAME\nfrom django.db import transaction\nimport re\n\nclass RegexForm(forms.Form):\n    _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)\n    from_regex = forms.CharField(label=\'From\', required=True)\n    to_regex = forms.CharField(label=\'To\', required=True)\n    #flags = forms.CharField(label=\'Flags\')\n\ndef apply_regex_global(admin, request, queryset, fieldname):\n    _selected_action = request.POST.getlist(ACTION_CHECKBOX_NAME)\n    form = None\n    if \'apply\' in request.POST:\n        form = RegexForm(request.POST)\n        if form.is_valid():\n            with transaction.commit_manually():\n                try:\n                    for o in queryset:\n                        old_value = getattr(o, fieldname)\n                        new_value = re.sub(form.data[\'from_regex\'],\n                                           form.data[\'to_regex\'], old_value)\n                        setattr(o, fieldname, new_value)\n                        o.save()\n                    transaction.commit()\n                finally:\n                    transaction.rollback()\n            admin.message_user(request, "Successfully applied a regex.")\n            return HttpResponseRedirect(request.get_full_path())\n    if not form:\n        form = RegexForm(initial={\'_selected_action\': _selected_action})\n    return render(request, "apply_regex.html", {\n        \'form\': form,\n        \'title\': \'Apply regex\'}\n    )\n\n# from apply_regex import apply_regex_global\nclass ProductAdmin(admin.ModelAdmin):\n    list_display = (\'product\', \'vendor\', \'devicetype\')\n    search_fields = [\'product\', ]\n    formfield_overrides = make_textarea_use_textinput\n\n    actions = [\'apply_regex\']\n    def apply_regex(self, request, queryset):\n        return apply_regex_global(self, request, queryset, "product")\n\nadmin.site.register(Product, ProductAdmin)\n
Run Code Online (Sandbox Code Playgroud)\n

Buf*_*fke 5

我以前已经解决过这个问题。请参阅此差异。基本上从查询集中获取 id,而不是 POST 数据。

queryset.values_list('id', flat=True)