使用过滤器将表单提交给 django-admin 模型

Posted

技术标签:

【中文标题】使用过滤器将表单提交给 django-admin 模型【英文标题】:submit form to django-admin model with filter 【发布时间】:2011-08-09 13:59:07 【问题描述】:

我想要一个自定义 sn-p 的 html 表单代码,它允许用户选择一个“培训”,然后将其用作 django-admin 模型过滤器的“参与者”的查询参数。

我已经在modeladmin上成功创建了过滤器:

class ParticipantAdmin(RestrictedModelAdmin):
    list_filter = ('training__name',)

可能值得注意的是 RestrictedModleAdmin 是 ModelAdmin 的子类,它为模型提供行级安全性;登录的用户应该只能看到他们拥有的行。

因此,使用此过滤器的网址在仅使用该管理界面时看起来像这样:

/admin/core/participant/?training__name=Menno+Ropes

一切都很好。现在我想我应该能够创建一个非常简单的表单,允许选择有效的“培训”并将其作为 GET 提交给 /admin/core/participant/。

<form method="GET" action="/admin/core/participant/">% csrf_token %
    <ol>
        <li>Select your training:
            <select name='training__name'>
                <option value=''>&mdash;</option>
                % for training in trainings %
                <option value=' training.name '> training </option>
                % endfor %
            </select>
        </li>
        <li>See participants for that training.
            <input type='submit' name='submit' value='Submit' /></li>
    </ol>
</form>

这最后一点似乎不起作用。 django 内脏中的一些魔法 foo 似乎总是将提交内容破坏为:

/admin/core/participant/?e=1

这显然没有选择适当的过滤器值,因此显示了未过滤的“参与者”列表。

发生了什么事?我该怎么做才能让它允许我的 GET 参数传递给管理模型?

提前致谢。

PS) Django 1.3+

【问题讨论】:

【参考方案1】:

这有点棘手,但对我有用:

def changelist_view(self, request, bill_id, extra_context=None):
    """queryset is an extra parameter"""
    req = request.GET.copy()
    if 'queryset' in req:
        queryset = req.pop('queryset')[0]
    else:
        queryset = request.META['HTTP_REFERER'].split('queryset=')[1]
        url = "/admin/billing/invoice/%s/select_to_move/?%s&queryset=%s" % (bill_id, request.GET.urlencode(), queryset)
        return HttpResponseRedirect(url)  
    request.GET = req
    # Do stuff with queryset.
    return super(MyAdminClass, self).changelist_view(request, context)    

【讨论】:

【参考方案2】:

问题是您的&lt;input type="submit"&gt; 中有一个name 属性,导致额外的GET 参数:submit 引发无效查找错误,因此引发e=1

删除name 属性,一切顺利。

我做了一个小实验来确认,因为我觉得奇怪的是服务器可能会以不同的方式对待浏览器 GET。

【讨论】:

是的,Django 将过滤器参数限制为您定义的过滤器,并且不会接受任意参数。这样一来,人们就无法在未明确定义为“可用”的列表中提出查询。 太棒了!除了去掉提交按钮名称属性之外,我还必须从原始 html sn-p 中去掉 % csrf_token % django 标签。谢谢@yuji-tomita @portman - 如果这个答案帮助你解决了问题,你应该点击答案旁边的复选标记。

以上是关于使用过滤器将表单提交给 django-admin 模型的主要内容,如果未能解决你的问题,请参考以下文章

使用ajax将表单提交给php而不刷新页面

将提交时的重力表单重定向到刚刚创建的帖子

在同一页面上提交表单时如何预填充下拉列表?

Django-admin:如何在记录更改列表中显示指向对象信息页面的链接而不是编辑表单?

使用 Redux-Form 进行搜索过滤器,如何“重置”并重新提交表单?

django-admin 仿写stark组件action,filter筛选过滤,search查询