我认为无论出于何种原因这很容易做到,但我看得更深,似乎没有直接的方法允许用户在实例的"更改"视图上执行自定义管理操作(即,当您只是查看编辑时屏幕显示单个实例,而不是实例列表).
我忽略了一个简单的方法吗?或者是我唯一的选择来覆盖其中一个管理模板(可能还有ModelAdmin.add_view
方法)?
这是这个答案的更新和改进.它适用于django 1.6并重定向到你来自的地方.
class ActionInChangeFormMixin(object): def response_action(self, request, queryset): """ Prefer http referer for redirect """ response = super(ActionInChangeFormMixin, self).response_action(request, queryset) if isinstance(response, HttpResponseRedirect): response['Location'] = request.META.get('HTTP_REFERER', response.url) return response def change_view(self, request, object_id, extra_context=None): actions = self.get_actions(request) if actions: action_form = self.action_form(auto_id=None) action_form.fields['action'].choices = self.get_action_choices(request) else: action_form = None extra_context=extra_context or {} extra_context['action_form'] = action_form return super(ActionInChangeFormMixin, self).change_view(request, object_id, extra_context=extra_context) class MyModelAdmin(ActionInChangeFormMixin, ModelAdmin): ......
模板:
{% extends "admin/change_form.html" %} {% load i18n admin_static admin_list admin_urls %} {% block extrastyle %} {{ block.super }} {% endblock %} {% block object-tools %} {{ block.super }}{% endblock %}
这就是我最终做的事情.
首先,我扩展了ModelAdmin对象的change_view,如下所示:
def change_view(self, request, object_id, extra_context=None): actions = self.get_actions(request) if actions: action_form = self.action_form(auto_id=None) action_form.fields['action'].choices = self.get_action_choices(request) else: action_form = None changelist_url = urlresolvers.reverse('admin:checkout_order_changelist') return super(OrderAdmin, self).change_view(request, object_id, extra_context={ 'action_form': action_form, 'changelist_url': changelist_url })
基本上我们只是收集填充更改视图中的操作下拉列表所需的数据.
然后我只是为有问题的模型扩展了change_form.html:
{% extends "admin/change_form.html" %} {% load i18n adminmedia admin_list %} {% block extrastyle %} {{ block.super }} {% endblock %} {% block object-tools %} {{ block.super }}{% endblock %}
这与在更改列表视图中输出管理操作部分的方式几乎相同.主要区别在于:1)我必须指定要发布到的表单的URL,2)而不是用于指定应更改哪些对象的复选框,通过隐藏表单字段设置值,以及3)我将更改列表视图中的CSS包含在内,并将操作卡在ID为div的div中#changelist
- 这样框就会看起来不错.
这不是一个很好的解决方案,但它可以正常运行,无需额外配置即可添加其他操作.