将“另存为新”按钮添加到 Django 外部对象编辑弹出窗口

Posted

技术标签:

【中文标题】将“另存为新”按钮添加到 Django 外部对象编辑弹出窗口【英文标题】:Add "Save as new" button to Django foreign object edit popup 【发布时间】:2018-03-02 10:48:13 【问题描述】:

在 Django 中,我们有用于 ModelAdmin 的 save_as 参数,它可以在管理员的站点编辑页面上启用“另存为新”按钮。

但是当对象(Model1 实例)默认与其他模型(Model2)有关系时,我想按以下方式编辑 Model2 实例:为当前关系取默认值(取决于 Model2 实例字段)Model1 实例和编辑它的一些字段,我单击编辑按钮并出现弹出窗口,我可以在其中更改一些字段,但不能将该对象另存为新对象,因此我有 2 个选项:损坏默认对象或复制粘贴该对象的每个字段相关对象到“添加新”弹出窗口中。

我想在编辑弹出窗口中添加“另存为新”按钮。

我发现,用name="_saveasnew"value=1添加隐藏输入实际上是保存另一个模型,但是如何用特殊按钮添加它呢?

此外,该按钮上有一个用于弹出窗口的特殊块,如我所见:https://github.com/django/django/blob/1.8/django/contrib/admin/templatetags/admin_modify.py#L39(是的,我们使用 Django 1.8 :() 最好的解决方案是:编辑模板还是编辑标签本身?

【问题讨论】:

【参考方案1】:

正确的解决方案是使用您自己的submit_row 模板标签作为弹出窗口,为此,您必须覆盖admin/change_form.html 模板的块:submit_buttons_topsubmit_buttons_bottom

% extends "admin/change_form.html" %
% load YOUR_TEMPLATE_TAGS %

% block submit_buttons_top %% YOUR_SUBMIT_ROW_TAG %% endblock %

% block submit_buttons_bottom %% YOUR_SUBMIT_ROW_TAG %% endblock %

新的submit_row标签代码的主要区别是更改了上下文键:'show_save_as_new': change and save_as,

YOUR_TEMPLATE_TAGS.py 的代码可能如下所示:

from django import template

register = template.Library()


@register.inclusion_tag('admin/submit_line.html', takes_context=True)
def YOUR_SUBMIT_ROW_TAG(context):
    """
    Displays the row of buttons for delete and save.

    HINT: override of default django `submit_row` tag, changes:
          `save as new` button is displayed for popup.
    """
    opts = context['opts']
    change = context['change']
    is_popup = context['is_popup']
    save_as = context['save_as']
    new_context = 
        'opts': opts,
        'show_delete_link': (
            not is_popup and context['has_delete_permission'] and
            change and context.get('show_delete', True)
        ),
        'show_save_as_new': change and save_as,
        'show_save_and_add_another': (
            context['has_add_permission'] and not is_popup and
            (not save_as or context['add'])
        ),
        'show_save_and_continue': not is_popup and context['has_change_permission'],
        'is_popup': is_popup,
        'show_save': True,
        'preserved_filters': context.get('preserved_filters'),
    
    if context.get('original') is not None:
        new_context['original'] = context['original']
    return new_context

【讨论】:

以上是关于将“另存为新”按钮添加到 Django 外部对象编辑弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

将编辑的 SVG 文件另存为新文件或数据库

将 Excel 文件另存为新创建的文件夹

如何将选定的工作表另存为新工作簿

如何将文件夹中的多个源工作簿中的数据复制到另一个工作簿,然后另存为新工作簿

遍历下拉列表并将工作簿另存为新文件

C# 读取Excel模板 修改某行某列的值 另存为新的Excel