Reputation: 2209
I have a workflow for a model in the Django admin that is very similar to the users' workflow. First, I have a form with basic fields and then, a second form with the rest of the data.
It's the same workflow as auth.user
I need to remove "save and continue" and "save and add another" buttons to prevent the user breakoing the workflow.
I have tried to add it as extra_context:
extra_context = {
'show_save_and_add_another': False,
'show_save_and_continue': False
}
and pass it through ModelAdmin.add_view or ModelAdmin.change_view but it doesn't work.
This is only for one model, so I don't want to remove from submit_line.html
Any clue or alternative way?
Thanks in advance
Upvotes: 19
Views: 15414
Reputation: 1
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
Upvotes: 1
Reputation: 1648
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;
}
Upvotes: 5
Reputation: 23871
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
Upvotes: 17
Reputation: 5835
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:
show_save_and_add_another
from the original context without overwriting it, or pass through your own really_hide_save_and_add_another_damnit
context variable.submit_row
with it.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.
Upvotes: 13