Django管理员表单行动不发送POST参数

时间:2015-07-23 15:03:52

标签: python django django-admin

我有这个模特管理员:

class Items(admin.ModelAdmin)

    actions = ['action_create_task']

    def action_create_task(self, request, queryset):
        if request.POST.get('post'):
            form = CreateTaskAction(request.POST)

            if form.is_valid():
                # doing something
                self.message_user(request, "Success appended task!")
                return redirect(request.get_full_path())
        else:
            form = CreateTaskAction()

        return render(request, 'create_task.html', {
            'title': 'Create task for selected items',
            'itmes': queryset,
            'form': form
        })

我在模板create_task.html

上使用此HTML代码
{% extends "admin/base_site.html" %}

{% block content %}

    {% load staticfiles %}

    <form action="" method="post">
        {% csrf_token %}

        {{ form }}

        <h2>Create task for this items</h2>
        <ul>{{ items|unordered_list }}</ul>

        <input type="hidden" name="action" value="action_create_task" />
        <input type="hidden" name="post" value="yes" />
        <input type="submit" value="Create task" />
    </form>
{% endblock %}

但是,如果我选择一些项目,接下来选择操作,然后提交Create Task Action表单,我没有收到任何POST,只会重定向到没有消息等的对象列表。换句话说,当我提交我的表单我重定向到网站列表,而不调用我的动作功能。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您正在编写一个需要中间页面的更复杂的管理操作。您正在混合您的动作功能和动作视图(中间视图)。当您触发一个动作时,django提供的视图会处理它并调用您提供所选模型实例(查询集)的动作函数,之后,调用视图会将用户重定向回原始更改列表页面。因此,您可以将表单有效地发布到应该处理操作请求的django视图,这就是您继续获取刷新重定向的原因。

您要做的是创建一个create_task_view:

class Items(admin.ModelAdmin)

    actions = ['action_create_task']

    def action_create_task(self, request, queryset):
        # do some validation on queryset and request
        if all good:
            return HttpResponseRedirect(/path_to_create_task_view)
        else:
            self.message_user('action rejected')

    def create_task_view(self, request):
        if request.method == 'POST':
            form = CreateTaskAction(request.POST)
            if form.is_valid():
                # doing something
                self.message_user(request, "Success appended task!")
                return HttpResponseRedirect(/somewhere)
        else:
            form = CreateTaskAction()

        return render(request, 'create_task.html', {
            'title': 'Create task for selected items',
            'itmes': queryset,
            'form': form
        })

请注意,您可能希望避免硬编码的网址,请参阅reverse resolution of URLS。另请参阅actions that provides intermediate pages