In addition to adding a button to the change_form template, you want to override the response_change ModelAdmin (and response_add ) method.
Something like this should work:
def response_change(self, request, obj): res = super(MyModelAdmin, self).response_change(request, obj) if "_preview" in request.POST: return HttpResponseRedirect('preview-url-here') else: return res
source share