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

时间:2011-04-20 14:40:00

标签: django django-admin

我希望有一个自定义的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 +

2 个答案:

答案 0 :(得分:2)

问题是您的name中有一个<input type="submit">属性,导致额外的GET参数:submit,这会导致无效的查找错误,从而e=1 < / p>

删除name属性,你就可以了。

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

答案 1 :(得分:0)

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

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)