Search code examples
djangoviewadmin

How to add button to "submit_row" context in django


I would like to add an extra button to the submit row in django. Standard we get "delete", "save", "save and continue editing" and "save and add another". To this set I would like to add another button which would call a function on the model.

As far as I understand the template change_form is generated in one of the admin.views. The context submit_row is passed as context.

I want to edit the context of the admin view. Where can I find it in my filesystem?


Solution

  • From what I can tell, there are two relevant files. The first is

    .../django/contrib/admin/templatetags/admin_modify.py
    

    which has the following section:

    @register.inclusion_tag('admin/submit_line.html', takes_context=True)
    def submit_row(context):
        """
        Displays the row of buttons for delete and save.
        """
        opts = context['opts']
        change = context['change']
        is_popup = context['is_popup']
        save_as = context['save_as']
        return {
            'onclick_attrib': (opts.get_ordered_objects() and change
                                and 'onclick="submitOrderForm();"' or ''),
            'show_delete_link': (not is_popup and context['has_delete_permission']
                                  and (change or context['show_delete'])),
            'show_save_as_new': not is_popup and 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
        }
    

    And the second is

    .../django/contrib/admin/templates/admin/submit_line.html
    

    which is the following:

    {% load i18n %}
    <div class="submit-row">
    {% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" {{ onclick_attrib }}/>{% endif %}
    {% if show_delete_link %}<p class="deletelink-box"><a href="delete/" class="deletelink">{% trans "Delete" %}</a></p>{% endif %}
    {% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" {{ onclick_attrib }}/>{%endif%}
    {% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" {{ onclick_attrib }} />{% endif %}
    {% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" {{ onclick_attrib }}/>{% endif %}
    </div>
    

    You can probably just add some custom html to the second file to display new buttons.