17👍
Beside its (a bit awkward) hacking style, you could aslo override the template tag directly.
Normally overriding template is more recommended.
# put this in some app such as customize/templatetags/admin_modify.py and place the app
# before the 'django.contrib.admin' in the INSTALLED_APPS in settings
from django.contrib.admin.templatetags.admin_modify import *
from django.contrib.admin.templatetags.admin_modify import submit_row as original_submit_row
# or
# original_submit_row = submit_row
@register.inclusion_tag('admin/submit_line.html', takes_context=True)
def submit_row(context):
ctx = original_submit_row(context)
ctx.update({
'show_save_and_add_another': context.get('show_save_and_add_another', ctx['show_save_and_add_another']),
'show_save_and_continue': context.get('show_save_and_continue', ctx['show_save_and_continue'])
})
return ctx
13👍
This isn’t possible with an ‘out of the box’ option as far as I can tell, but this is how I’d go about doing what you want to do.
The bit of code we care about is this templatetag – this seems to override show_save_and_add_another
and show_save_and_continue
regardless of what you have set it to. It also creates a whole new context and copies only certain values across (not clear what the justification for this is), so you’ll have to modify it to get what you need.
So:
- Create a templatetag that replicates the functionality of the default tag, either by reusing the existing one (see okm’s example) or by duplicating it entirely. The only change here is that it should either keep your
show_save_and_add_another
from the original context without overwriting it, or pass through your ownreally_hide_save_and_add_another_damnit
context variable. - Replace change_form.html to include and use your own templatetag, replacing
submit_row
with it. - Update change_form.html if you’ve gone for the option of using an extra context variable, wrapping the buttons with another conditional statement.
Then, regardless of what option you went for, update your ModelAdmin with something like (based on this from the Django docs):
class MyModelAdmin(admin.ModelAdmin):
# ...
def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['show_save_and_add_another'] = False
# or
extra_context['really_hide_save_and_add_another_damnit'] = True
return super(MyModelAdmin, self).change_view(request, object_id,
form_url, extra_context=extra_context)
Updated: Original response didn’t take in to account the submit_row not passing along any the whole original context.
- Python: How can I override one module in a package with a modified version that lives outside the package?
- Checking if a Django user has a password set
- {% load static %} and {% load staticfiles %}: which is preferred?
- How can I easily convert a Django app from mySQL to PostgreSQL?
5👍
A very different approach can be to add the following in
/static/admin/css/base.css
input[name="_addanother"],input[name="_continue"],input[name="_saveasnew"]{
display: none;
}
0👍
To remove "Save and continue editing" button and "Save and add another" button, set "False" to "extra_context[‘show_save_and_continue’]" in "changeform_view()" and return "False" in "has_add_permission()" respectively as shown below:
# "admin.py"
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['show_save_and_continue'] = False # Here
return super().changeform_view(request, object_id, form_url, extra_context)
def has_add_permission(self, request, obj=None): # Here
return False