【问题标题】:overriding submit_line.html for a single model or app覆盖单个模型或应用程序的 submit_line.html
【发布时间】:2015-06-09 18:17:00
【问题描述】:

我想为单个模型或单个应用程序覆盖 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. 单击按钮时,我执行 ajax 调用并在添加 div 下方显示结果,并且在用户单击按钮之前一直显示此页面。

这一切都有效 - 我唯一的问题是行被添加到数据库中 - 我想以某种方式防止这种情况发生。

这是我的代码:

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

这是我的 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 %}

【问题讨论】:

    标签: ajax django django-admin


    【解决方案1】:

    可以覆盖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

    【讨论】:

    • 这很好用。谢谢!但是在我的自定义代码运行后,它仍然运行默认的添加代码。我怎样才能防止这种情况发生?
    • 默认添加代码是什么意思?您能否添加示例代码.. 到目前为止您所做的以及您尝试使用自定义提交行实现的目标..
    • 我对 submit_buttons_bottom 的覆盖有一个按钮,该按钮调用一些不会将行添加到数据库的自定义代码。当我的代码完成后,会运行一些添加行的东西。我不希望这种情况发生。明天我将发布我的代码。我还将查看是否可以使用调试器找出正在添加行的正在运行的内容。
    • 我已经添加了代码并说出了我想要实现的目标。感谢您花时间查看它。
    • 我通过从自定义按钮中删除 type="submit" 解决了添加页面返回主管理页面的问题。然后我添加了另一个按钮,他们可以点击返回。我已经更新了我的代码以显示这一点。我仍然有添加行的问题。我想解决这个问题,但由于它只是一张虚拟桌子,我可以忍受它。
    【解决方案2】:

    也可以像这样覆盖/扩展最里面的{% 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 模板。

    【讨论】:

    • 有一个叫做“submit-row”的块,但是它在模板中使用,然后用于渲染模板标签,所以它不会被web的模板访问页。除非我什么都不知道。如果是这种情况,请告诉我,我会投赞成票。
    • 在该模板中无法访问它,但是,模板标签是通过 InclusionAdminNode 呈现的,它会查找 'admin/%s/%s/%s' % (app_label, object_name, self.template_name) 等等,因此您绝对可以在每个应用程序上自定义它/每个模型的基础。
    • 请注意,这是更干净的解决方案; this gist中的实际实现细节
    猜你喜欢
    • 2012-09-15
    • 2018-05-22
    • 2016-12-11
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多