I want to add custom buttons to the add/change form at the administration interface. By default, there are only three:
I have created some custom methods in my forms.py
file, and I want to create buttons to call these methods. I have used the snippet http://djangosnippets.org/snippets/1842/, but it's not exactly what I want. This one allows to create buttons and call methods from the admin.py
file and not forms.py
.
Is there a way to do that?
This is my admin.py
code:
class CategoryAdmin(admin.ModelAdmin):
prepopulated_fields = { "alias": ("title",) }
form = CategoryForm
admin.site.register(Category, CategoryAdmin)
And my forms.py
code,
class CategoryForm(forms.ModelForm):
"""
My attributes
"""
def custom_method(self):
print("Hello, World!")
How do I create a button that calls "custom_method()"?
You can override admin/change_form.html
. Copy the version in contrib.admin.templates
into your project. Mine is myproject/templates/admin/change_form.html
, but you could use /myproject/myapp/templates/admin/change_form.html
.
Next, edit the copy and change the two references to the existing template tag, {% submit_row %}
, to point to your own template tag, {% my_template_tag %}
.
Base your template tag on the contrib.admin
's {% submit_row %}
, but edit the HTML template to contain any extra buttons you want to display.
One simple way I found to add buttons is to add another row for the custom buttons. Create an admin directory in your template dir based on your needs. For example I usually add buttons for specific models in a custom template. Make a "templates/admin/app/model/" directory.
Then add a file change_form.html.
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block submit_buttons_bottom %}
<div class="submit-row">
<input type="button" value="{% trans 'Another Button' %}" name="_anotherbutton" />
</div>
{{ block.super }}
{% endblock %}
The code before the {{ block.super }}
is inspired by the submit_line.html template used by the template tag {% submit_row %}
. I prefer this method because is straightforward but you must live with another row of buttons.
The submit buttons in a change form are rendered by the submit_row
template tag. This tag renders the template admin/submit_line.html
. Since you want to add to the existing buttons, your best (and DRYest) approach is to override admin/submit_line.html
.
For example, create a file my_project/templates/admin/submit_line.html
with the following content:
{% load i18n admin_urls %}
<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="{% url opts|admin_urlname:'delete' original.pk|admin_urlquote %}" 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 %}
<input type="submit" value="{% trans 'New button 1' %}" name="_button1" {{ onclick_attrib }}/>
<input type="submit" value="{% trans 'New button 2' %}" name="_button2" {{ onclick_attrib }}/>
</div>
Most of what's above was copied from django/contrib/admin/templates/submit_line.html
. You can also add additional if
statements in the template if you only want to show those additional buttons in certain cases.