当前位置:  开发笔记 > 后端 > 正文

除了"更改列表"视图之外,有没有办法让自定义Django管理操作出现在"更改"视图中?

如何解决《除了"更改列表"视图之外,有没有办法让自定义Django管理操作出现在"更改"视图中?》经验,为你挑选了2个好方法。

我认为无论出于何种原因这很容易做到,但我看得更深,似乎没有直接的方法允许用户在实例的"更改"视图上执行自定义管理操作(即,当您只是查看编辑时屏幕显示单个实例,而不是实例列表).

我忽略了一个简单的方法吗?或者是我唯一的选择来覆盖其中一个管理模板(可能还有ModelAdmin.add_view方法)?



1> 小智..:

这是这个答案的更新和改进.它适用于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 }}
    
{% csrf_token %} {% admin_actions %}
{% endblock %}



2> jsdalton..:

这就是我最终做的事情.

首先,我扩展了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 }}
    
{% csrf_token %} {% admin_actions %}
{% endblock %}

这与在更改列表视图中输出管理操作部分的方式几乎相同.主要区别在于:1)我必须指定要发布到的表单的URL,2)而不是用于指定应更改哪些对象的复选框,通过隐藏表单字段设置值,以及3)我将更改列表视图中的CSS包含在内,并将操作卡在ID为div的div中#changelist- 这样框就会看起来不错.

这不是一个很好的解决方案,但它可以正常运行,无需额外配置即可添加其他操作.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有