我希望有一个自定义的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=''>—</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 +
答案 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)