diff --git a/accounts/admin.py b/accounts/admin.py
index 60374ee44adb5c8817a2dc400b84de7d0e33be24..cb9b32853e8811378eab241b90b5445fb34c3049 100644
--- a/accounts/admin.py
+++ b/accounts/admin.py
@@ -10,6 +10,7 @@ admin.site.unregister(Group)
 @admin.register(EmailUser)
 class EmailUserAdmin(ExportCsvMixin, admin.ModelAdmin):
 	"""option d'affichage des activités dans la vue django admin"""
+	filename = "export_utilisateurs.csv"
 	list_display = ("email", "last_name", "first_name", "is_superuser", "is_active", "email_confirmed",)
 	list_filter = ("is_superuser","is_active", "email_confirmed",)
 	list_editable = ("is_superuser","is_active")
diff --git a/home/admin.py b/home/admin.py
index 3a44c2d6b27508c05e50b6f1dd785c57b5ace247..d93a6c02d929d6b2442bd23041ecfc1a13b555b7 100644
--- a/home/admin.py
+++ b/home/admin.py
@@ -12,6 +12,7 @@ admin.site.site_title = "Admin Interludes"
 @admin.register(InterludesActivity)
 class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin):
 	"""option d'affichage des activités dans la vue django admin"""
+	filename = "export_activites.csv"
 	list_display = ("title", "host_name", "display", "must_subscribe","on_planning")
 	list_filter = ("display", "must_subscribe", "on_planning", "status")
 	ordering = ("title", "host_name",)
@@ -34,6 +35,7 @@ class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin):
 @admin.register(InterludesParticipant)
 class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin):
 	"""option d'affichage des participant dans la vue django admin"""
+	filename = "export_participants.csv"
 	list_display = ("user", "school", "is_registered")
 	list_filter = (
 		"school", "is_registered", "sleeps",
@@ -46,6 +48,7 @@ class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin):
 @admin.register(ActivityList)
 class ActivityListAdmin(ExportCsvMixin, admin.ModelAdmin):
 	"""option d'affichage des choix d'activités dans la vue django admin"""
+	filename = "export_choix_activite.csv"
 	list_display = ("activity", "participant", "priority", "accepted")
 	list_filter = (
 		"activity", "participant__is_registered", "activity__display",
diff --git a/shared/admin.py b/shared/admin.py
index 6e5db2342165741429d4b1f2c9f3ae34e8464bc5..93405128fa031a30dbb3109ed84dbe64a2593f7d 100644
--- a/shared/admin.py
+++ b/shared/admin.py
@@ -1,31 +1,30 @@
-import csv
+from shared.views import CSVWriteView
 
-from django.http import HttpResponse
+class CSVWriteViewForAdmin(CSVWriteView):
+	def get_values(self):
+		return self.queryset.values()
 
 class ExportCsvMixin:
 	"""
 	class abstraite pour permettre l'export CSV rapide d'un modele
 	utiliser csv_export_exclude pour exclure des colonnes du fichier généré
 	"""
-	def export_as_csv(self, request, queryset):
-		"""renvoie un fichier CSV contenant l'information du queryset"""
-		meta = self.model._meta
-		field_names = [field.name for field in meta.fields]
-
-		if self.csv_export_exclude:
-			field_names = [field for field in field_names if not field in self.csv_export_exclude]
+	filename = None
 
-		response = HttpResponse(content_type='text/csv')
-		response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
-		writer = csv.writer(response)
+	csv_export_exclude = []
 
-		writer.writerow(field_names)
-		for obj in queryset:
-			writer.writerow([getattr(obj, field) for field in field_names])
+	def get_filename(self):
+		if self.filename:
+			return self.filename
+		return str(self.model._meta)
 
-		return response
+	def export_as_csv(self, request, queryset):
+		"""renvoie un fichier CSV contenant l'information du queryset"""
+		view = CSVWriteViewForAdmin(
+			request=request, queryset=queryset, model=self.model,
+			filename=self.get_filename(), exclude_fields = self.csv_export_exclude,
+		)
+		return view.get(request)
 
 	export_as_csv.short_description = "Exporter au format CSV"
-
 	actions = ["export_as_csv"]
-	csv_export_exclude = None
diff --git a/shared/views.py b/shared/views.py
index 5ff4d21d60ee6e6461036b70bd1d8ab975fa04e4..5bbc0c806d77711d64df0291f30b121793bd5362 100644
--- a/shared/views.py
+++ b/shared/views.py
@@ -18,31 +18,47 @@ class CSVWriteView(View):
 	filename = "csv_file.csv"
 	headers = None
 	model = None
+	exclude_fields = []
 
-
+	def get_filename(self):
+		return self.filename
 
 	def get_headers(self):
 		"""overload this to dynamicaly generate headers"""
 		if self.headers:
 			return self.headers
 		if self.model:
-			return [field.name for field in self.model._meta.fields]
+			return [field.name for field in self.get_field_names()]
 		return None
 
+	def get_values(self):
+		"""overload to change queryset used in self.get_rows"""
+		if self.model:
+			return self.model.objects.values()
+		raise NotImplementedError("{}.get_values() isn't implemented when model is None".format(
+			self.__class__.__name__
+		))
+
+	def get_field_names(self):
+		"""overload to limit/change field names
+		default to all minus those in exclude_fields"""
+		return [
+			field for field in self.model._meta.fields
+			if not field.name in self.exclude_fields
+		]
+
 	def get_rows(self):
 		"""overload this to return the list of rows"""
-		if self.model:
-			queryset = self.model.objects.values()
-			fields = self.model._meta.fields
-			table = []
-			for row in queryset:
-				table.append([row[field.name] for field in fields])
-			return table
-		raise NotImplementedError("{}.get_rows isn't implemented".format(self.__class__.__name__))
+		queryset = self.get_values()
+		fields = self.get_field_names()
+		table = []
+		for row in queryset:
+			table.append([row[field.name] for field in fields])
+		return table
 
 	def get(self, request, *args, **kwargs):
 		response = HttpResponse(content_type='text/csv')
-		filename = self.filename
+		filename = self.get_filename()
 		if not filename.endswith(".csv"):
 			filename += ".csv"
 		response['Content-Disposition'] = 'attachment; filename="{}"'.format(self.filename)