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
The simplest option is to set save_as=True on the ModelAdmin . This will replace the "Save and add another" button with a "Save as new" button.
Django admin allows access to users marked as is_staff=True . To disable a user from being able to access the admin, you should set is_staff=False . This holds true even if the user is a superuser. is_superuser=True .
Take a look at the Model Meta in the django documentation. Within a Model you can add class Meta this allows additional options for your model which handles things like singular and plural naming. Show activity on this post. inside model.py or inside your customized model file add class meta within a Model Class.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With