我有这个模特管理员:
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
{% 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,只会重定向到没有消息等的对象列表。换句话说,当我提交我的表单我重定向到网站列表,而不调用我的动作功能。我做错了什么?
答案 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。