我有兴趣为管理界面创建一个动作,除了所选项目之外还需要一些其他信息。我的例子是批量添加漫画到系列。 (是的,我知道显而易见的答案是创建一个具有X对X关系的模式,但为了一个简单的例子,请耐心等待。)
在这个例子中,我创造了100个漫画。在创建它们之后,我想将它们与已经创建的系列对象相关联。要在管理员中执行此操作,我想选择项目然后启动操作。然后我应该被问到要使用哪个系列对象(通过弹出窗口,中间窗体等)。
我按照here的说明,声称通过中间形式完成此操作。使用它之后,我没有得到任何更多的错误,但是动作本身也没有被执行 - forloop永远不会被执行。相反,它返回漫画的管理列表,并显示以下消息:“未选择任何操作。”
我的admin.py方法:
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
def addSeries(self, request, queryset):
form = None
if 'cancel' in request.POST:
self.message_user(request, 'Canceled series linking.')
return
elif 'link_series' in request.POST:
form = self.SeriesForm(request.POST)
if form.is_valid():
series = form.cleaned_data['series']
for x in queryset:
y = Link(series = series, comic = x)
y.save()
self.message_user(request, self.categorySuccess.render(Context({'count':queryset.count(), 'series':series})))
return HttpResponseRedirect(request.get_full_path())
if not form:
form = self.SeriesForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})
return render_to_response('setSeries.html', {'comics': queryset, 'form': form, 'path':request.get_full_path()}, context_instance=RequestContext(request))
addSeries.short_description = 'Set Series'
我的中间表格setSeries.html:
<!DOCTYPE html>
<html>
<head>
<title>Create Series Links</title>
</head>
<body>
<h1>Create Series Links</h1>
<p>Choose the series for the selected comic(s):</p>
<form method="post" action="{{ path }}">
<table>
{{ form }}
</table>
<p>
<input type="hidden" name="action" value="changeSeries" />
<input type="submit" name="cancel" value="Cancel" />
<input type="submit" name="link_series" value="link_series" />
</p>
</form>
<h2>This categorization will affect the following:</h2>
<ul>
{% for comic in comics %}
<li>{{ comic.title }}</li>
{% endfor %}
</ul>
</body>
</html>
答案 0 :(得分:5)
我注意到的一件事是你的动作方法是“addSeries”,但在你称之为“changeSeries”的形式中。
在您的ModelAdmin中,您应该有这样一行:
actions = ['addSeries']
如果这就是您所拥有的那一行,那么您需要更改:
<input type="hidden" name="action" value="changeSeries" />
为:
<input type="hidden" name="action" value="addSeries" />
这就是Django的管理员如何知道选择了哪个动作。如果在选择操作和执行操作之间有中间形式,则需要在管理界面的选择菜单中保留操作名称。