d33*_*tah 4 python django django-admin
我刚刚测试我的中间管理页面并意识到我遇到了bug 15742。以下评论似乎表明我的代码是错误的:
\n\n\n\n\n这里的问题涉及如何将“查询集”从原始操作处理程序保留到处理中间页面的 POST 的代码。在引用的博客文章中,这样做是这样的:
\n\nRun Code Online (Sandbox Code Playgroud)\n\nif not form:\n form = self.AddTagForm(initial={\'_selected_action\': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})\n此代码实际上并未使用传递到操作函数中的查询集参数,而是使用发布数据中所选操作复选框的列表,该列表仅是单个页面上的 100 个复选框。操作代码应该使用传递的 queryset\n 参数,该参数包含所有项目的完整列表,而不是\n 此发布数据。然而,Django 的文档目前显示了\xe2\x80\x8be正是这种使用 POST 数据的技术,并且应该修复该问题。
\n
那么,什么是不涉及的正确方法request.POST.getlist呢?这是我的 apply_regex 现在的样子:
# 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)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2487 次 |
| 最近记录: |