覆盖单个模型或应用程序的submit_line.html

时间:2015-04-05 00:20:32

标签: ajax django django-admin

我想覆盖一个模型或单个应用程序的submit_line.html(要么工作 - 应用程序只有一个模型)。我在文档中看到我不能这样做(https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#templates-which-may-be-overridden-per-app-or-model

是否有某种方法可以测试调用模板的模型或应用程序,以便添加一些条件行为?或者是否有某种方法可以使用不同的模板来代替特定应用或模型的submit_line.html?

mishbah的回答解决了我最初的问题,但现在我面临另一个问题 - 当我的代码完成时,会运行添加行的内容。我不希望这种情况发生。

这是我想要完成的事情:

  1. 用户点击添加按钮
  2. 使用我的自定义按钮
  3. 显示添加对象页面
  4. 点击我的按钮后,我执行一个ajax调用并在add div下面显示结果,并显示此页面,直到用户点击一个按钮。
  5. 这一切都有效 - 我唯一的问题是行添加到数据库中 - 我会以某种方式防止这种情况发生。

    这是我的代码:

    在主管理页面上,我只有添加按钮:

    enter image description here

    这是我的change_form.html:

    {% extends "admin/change_form.html" %}
    
    {% block submit_buttons_bottom %}
    
    <style type="text/css">
        #id_tool_configuration {
            white-space: pre-wrap;
        }   
    </style>
    
    <div class="submit-row">
        <input value="Configure" class="default" name="configure" onclick="configureTools(document.getElementById('id_tool_configuration').value); " />
    </div>
    
    <script src="/static/scripts/jquery-1.7.js" type="text/javascript"></script>
    
    <script type="text/javascript">
        function configureTools(tcd) {
            var toolConfigData = tcd;
            var request = new XMLHttpRequest();
            var params = 'toolConfigData='+encodeURIComponent(toolConfigData);
            request.open('GET', '{% url 'motor.configuration.views.configure' %}?'+params);
            request.setRequestHeader("Content-type", "text/plain; charset=utf-8");
    
            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                    if (request.status == 200) {
                        status = 'Confguration results:';
                    }
                    else {
                        status = 'Confguration failed';
                    }
    
                    $('.submit-row').after(
                        $('<span />')
                        .html('<pre> ' + status + '\n' + request.responseText + '</pre>')
                        .after($('<button />').text('Return').click('function () { return; }'))
                    );
                }
            };
    
            request.send(null);
            return false;
        };
    </script>
    

    {%endblock%}

2 个答案:

答案 0 :(得分:4)

可以覆盖submit-row。只需覆盖modeladmin中的change_form模板:

class YourModelAdmin(admin.ModelAdmin):
    change_form_template = 'path/to/custom/change_form.html'

在您的自定义change_form.html中,您需要:

{% extends "admin/change_form.html" %}

并覆盖submit_buttons_bottom块:

{% block submit_buttons_bottom %}
     {# custom submit row goes here #}
{% endblock %} 

您可以定义自己的自定义submit_row模板标签,使用原始模板标签获取灵感:

请参阅https://github.com/django/django/blob/1101467ce0756272a54f4c7bc65c4c335a94111b/django/contrib/admin/templatetags/admin_modify.py#L24

另请参阅此answer以获取有关如何确定模板路径的解决方案。

答案 1 :(得分:0)

也可以像这样覆盖/扩展最里面的 {% block submit-row %}

{% block submit-row %}
    {% if extra_button_allowed %}
        <input type="submit" value="Get me tea" name="_get_tea" />
    {% endif %}
    {{ block.super }}
{% endblock %}

通过这种方式,您可以保持“保存”按钮的原始行为。

submit-row 块来自 django/contrib/admin/templates/admin/submit_line.html 模板。