添加中间表单后,Django 管理站点操作不起作用

Posted

技术标签:

【中文标题】添加中间表单后,Django 管理站点操作不起作用【英文标题】:Django admin site action not working after adding an intermediate Form 【发布时间】:2014-06-03 18:40:15 【问题描述】:

我有一个 django 模型,我想为其添加自定义操作。在此操作中,我需要添加一个带有选择表单的中间页面(下拉选择)。我用下面的代码来得到这个。

模型类:

class VerificationAdmin(admin.ModelAdmin):
      list_display   = ('id','asset_code', 'scan_time','credential','status','operator','location','auth_code','product_details')
      list_filter    = ('status','operator','location')
      ordering       = ('-scan_time',)
      search_fields  = ('asset_code',)
      actions = ['set_interval']

      class AddScanningIntervalForm(forms.Form):
           _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
           period_choice=["4 hrs","6 hrs","8 hrs","10 hrs","12 hrs"]
           interval = forms.ChoiceField(choices=[(x, x) for x in period_choice])

      @csrf_exempt
      def set_interval(self, request, queryset):
           print "before action"
           form = None
           if 'apply' in request.POST:
               form = self.AddScanningIntervalForm(request.POST)
               print "action taken"
               if form.is_valid():
                   interval = form.cleaned_data['interval']
                   print interval
                   count = 0
                   for vObj in queryset:
                       print vObj.asset_code,vObj.status,interval                
                       at=AlertTable(asset_code=vObj.asset_code,
                       status=vObj.status,interval=interval)
                       at.save()
                       count += 1

                   self.message_user(request, "Scanning Policy Successfully added to %s assets %s." %count)
                   return HttpResponseRedirect(request.get_full_path())
           if not form:
                   form = self.AddScanningIntervalForm(initial='_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME))
                   return render_to_response('admin/set_alert.html', 'verifications': queryset,'tag_form': form,context_instance=RequestContext(request))

      set_interval.short_description = "Add Periodic Scanning Policy"

添加模板部分:

<!DOCTYPE html>
% extends "admin/base_site.html" %

% block content %

<p>Select tag to apply:</p>

<form action="" method="post">

     tag_form 
    % csrf_token %

    <p>The scanning policy will be applied to:</p>

    <ul> verifications|unordered_list </ul>

    <input type="hidden" name="action" value="add_tag" />
    <input type="submit" name="apply" value="Set Interval" />
</form>

% endblock %

在中间页面上工作正常,但是在中间页面的表单中选择一个警报选项并单击设置间隔按钮后,我得到了结果“未选择任何操作”

【问题讨论】:

首先,创建自己的创建/更新视图可能比试图让管理员做你想做的事更好。无论如何,这通常是推荐的。第二,你能显示生成“未选择操作”的代码吗?我只看到“行动前”和“采取行动” 我认为“POST”请求后的部分代码不起作用,您可以在这部分帮助我... @skzryzg - 自定义操作已完整记录,不会远程“入侵管理员”。这就像说自定义表单是 'hacking django.forms'。 【参考方案1】:

这个问题有点老了,但供将来参考;确保中间形式的“action”输入属性与管理函数名称匹配。在这种情况下,使用 'set_interval' 而不是 'add_tag'。

此外,POST 上下文必须包含“_selected_action”值,该值应与所选项目 pks 匹配。

【讨论】:

你拯救了我的夜晚。谢谢

以上是关于添加中间表单后,Django 管理站点操作不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 django 管理操作中间页面重定向到更改表单页面

注册表单不起作用(CSRF 令牌丢失或不正确。) django

添加jQuery脚本后提交按钮不起作用

Django - 如果我在视图中将 2 个表单集放在一起,则添加多次相同视图的功能不起作用

使用 django ajax jquery 提交一个文件不起作用的表单

使用 Django 和 Mailchimp 的电子邮件订阅表单在部署后不起作用 (DigitalOcean)