如何创建需要其他信息的复杂管理操作?

时间:2010-08-31 00:20:30

标签: django action admin

我有兴趣为管理界面创建一个动作,除了所选项目之外还需要一些其他信息。我的例子是批量添加漫画到系列。 (是的,我知道显而易见的答案是创建一个具有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>

1 个答案:

答案 0 :(得分:5)

我注意到的一件事是你的动作方法是“addSeries”,但在你称之为“changeSeries”的形式中。

在您的ModelAdmin中,您应该有这样一行:

actions = ['addSeries']

如果这就是您所拥有的那一行,那么您需要更改:

<input type="hidden" name="action" value="changeSeries" />

为:

<input type="hidden" name="action" value="addSeries" />

这就是Django的管理员如何知道选择了哪个动作。如果在选择操作和执行操作之间有中间形式,则需要在管理界面的选择菜单中保留操作名称。