Django管理员添加自定义按钮

时间:2014-11-10 14:35:01

标签: django django-templates django-admin

我想在管理员更改表单的SAVE按钮旁边添加一个自定义按钮。我尝试在submit_line.html

中添加一个按钮
<input type="submit" action = "admin/{{id??}}" value="show PDF" name="show PDF{{ onclick_attrib }}/>

但它没有重定向到我的指定页面,我也不知道如何传递当前的ID。 实际上我不认为改变submit_line.html是个好主意,因为我只想在一个模型中使用它。那有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

我认为你可以添加自己的逻辑。在这里,您可以查看app详细名称,仅在您的应用中显示该按钮:

{% if opts.verbose_name == 'Your app verbose name' %}<input type="submit" value="{% trans 'Show PDF' %}" name="_show_pdf" {{ onclick_attrib }}/>{% endif %}

并在您的admin.py中:

class YourAdmin(admin.ModelAdmin):
    def response_change(self, request, obj):
        if '_continue' in request.POST:
            return HttpResponseRedirect(obj.get_admin_url())
        elif '_show_pdf' in request.POST:
            # Do some stuf here( show pdf in your case)

答案 1 :(得分:0)

Django1.10:

我会这样做,以避免接受的答案的冗长和额外的模板处理

1)在应用的模板目录中扩展admin/change_form.html(我希望你的应用模板命名为空间)并覆盖阻止submit_row

{% extends "admin/change_form.html" %}
{% block submit_row %}
    <div class="submit-row">
    {% if extra_buttons %}
        {% for button in extra_buttons %}
            {{ button }}
        {% endfor %}
    {% endif %}
    {% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}
    {% if show_delete_link %}
        {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
        <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
    {% endif %}
    {% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
    {% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}
    {% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %}
    </div>
{% endblock %}

当然,这假设button的字符串表示形式是适当的浏览器inputbutton元素,并使用django.utils.safestring.mark_safe标记为安全。或者,您可以使用safe模板过滤器或直接访问button的属性来构建<input>。在我看来,最好将这些东西隔离到python级别。

2)覆盖MyModelAdmin.change_viewMyModelAdmin.change_form_template

change_form_template = "my_app/admin/change_form.html"

def change_view(self, request, object_id, form_url='', extra_context=None):
    extra_context = extra_context or self.extra_context()
    return super(PollAdmin, self).change_view(
        request, object_id, form_url, extra_context=extra_context,
    )

答案 2 :(得分:0)

在我的情况下,我只需要用户在保存后才执行自定义操作,例如“添加另一个”,其他按钮(例如“导出为pdf”),所以我将它们放在更改列表中,因为添加按钮非常容易

如果您在这里遇到像我这样的情况,内置消息框架将解决问题。

添加响应消息很简单,您将需要覆盖
管理类save_model如下:

from django.utils.safestring import mark_safe

def save_model(self, request, obj, form, change):
    # if new model
    if not change:
        message_html = "<a href='http://yourSITE/admin/appname/appmodel/add/'>Add another</a>"
        messages.add_message(request, messages.INFO, mark_safe(message_html))
    super(YourAdminClass, self).save_model(request, obj, form, change)

有4种不同类型的消息(我更改了INFO的CSS),它们显示在屏幕截图中

enter image description here