Как сделать экспорт на почту через админку Django?
Есть небольшой проект с единственной моделью, есть функция экспорта и импорта данных через админку. Хочу добавить что-то по типу кнопки или галачки с выбором "отправить на компьютер или письмо". С указанием почты. Как это можно сделать?
админка:
from django.contrib import admin from mptt.admin import DraggableMPTTAdmin from .models import Person from django.core.exceptions import ValidationError from django import forms from import_export.admin import ImportExportModelAdmin from .resources import PersonResource from django.contrib.auth.models import Group, User class PersonForm(forms.ModelForm): class Meta: model = Person fields = '__all__' def clean(self): cleaned_data = super().clean() pids = cleaned_data.get('pids') if pids and self.instance in pids.all(): raise ValidationError("Нельзя связать человека с самим собой.") return cleaned_data class PersonAdminMixin: form = PersonForm list_display = ('tree_actions', 'indented_title', 'name', 'title', 'birthdate', 'gender', 'get_pids', 'fid', 'mid') list_display_links = ('indented_title',) list_filter = ('parent', 'birthdate', 'gender') search_fields = ('name',) def indented_title(self, obj): parent_name = obj.parent.name if obj.parent else '' if parent_name: depth = obj.level arrow = '--> ' * depth return f"{arrow} {obj.name}" else: return obj.name indented_title.short_description = 'Иерархия' def get_pids(self, obj): return ', '.join([str(pid) for pid in obj.pids.all()]) get_pids.short_description = 'Партнеры' fieldsets = ( ('Иерархия', {'fields': ('indented_title',)}), ('Персональные данные', {'fields': ('name', 'title', 'birthdate', 'gender')}), ('Семейная связь', {'fields': ('parent', 'fid', 'mid', 'pids')}), ('Изображение', {'fields': ('img',), 'classes': ('collapse',)}), ) readonly_fields = ('indented_title',) def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) if 'pids' in form.changed_data: pids = obj.pids.all() if obj in pids: raise ValidationError("Нельзя связать человека с самим собой.") class PersonAdmin(PersonAdminMixin, DraggableMPTTAdmin, ImportExportModelAdmin): resource_class = PersonResource admin.site.register(Person, PersonAdmin) admin.site.site_header = "Семейное Древо" admin.site.unregister(Group) admin.site.unregister(User) |
from django.contrib import admin from mptt.admin import DraggableMPTTAdmin from .models import Person from django.core.exceptions import ValidationError from django import forms from import_export.admin import ImportExportModelAdmin from .resources import PersonResource from django.contrib.auth.models import Group, User class PersonForm(forms.ModelForm): class Meta: model = Person fields = '__all__' def clean(self): cleaned_data = super().clean() pids = cleaned_data.get('pids') if pids and self.instance in pids.all(): raise ValidationError("Нельзя связать человека с самим собой.") return cleaned_data class PersonAdminMixin: form = PersonForm list_display = ('tree_actions', 'indented_title', 'name', 'title', 'birthdate', 'gender', 'get_pids', 'fid', 'mid') list_display_links = ('indented_title',) list_filter = ('parent', 'birthdate', 'gender') search_fields = ('name',) def indented_title(self, obj): parent_name = obj.parent.name if obj.parent else '' if parent_name: depth = obj.level arrow = '--> ' * depth return f"{arrow} {obj.name}" else: return obj.name indented_title.short_description = 'Иерархия' def get_pids(self, obj): return ', '.join([str(pid) for pid in obj.pids.all()]) get_pids.short_description = 'Партнеры' fieldsets = ( ('Иерархия', {'fields': ('indented_title',)}), ('Персональные данные', {'fields': ('name', 'title', 'birthdate', 'gender')}), ('Семейная связь', {'fields': ('parent', 'fid', 'mid', 'pids')}), ('Изображение', {'fields': ('img',), 'classes': ('collapse',)}), ) readonly_fields = ('indented_title',) def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) if 'pids' in form.changed_data: pids = obj.pids.all() if obj in pids: raise ValidationError("Нельзя связать человека с самим собой.") class PersonAdmin(PersonAdminMixin, DraggableMPTTAdmin, ImportExportModelAdmin): resource_class = PersonResource admin.site.register(Person, PersonAdmin) admin.site.site_header = "Семейное Древо" admin.site.unregister(Group) admin.site.unregister(User)
функция экспорта (file: resources.py, библиотека django-import-export)
from import_export import resources, fields from .models import Person class PersonResource(resources.ModelResource): parent_id = fields.Field(column_name='parent_id', attribute='parent_id') class Meta: model = Person fields = ('id', 'name', 'title', 'img', 'birthdate', 'gender', 'parent_id', 'fid', 'mid', 'pids') def dehydrate_parent_id(self, person): return person.parent_id if person.parent else None |
from import_export import resources, fields from .models import Person class PersonResource(resources.ModelResource): parent_id = fields.Field(column_name='parent_id', attribute='parent_id') class Meta: model = Person fields = ('id', 'name', 'title', 'img', 'birthdate', 'gender', 'parent_id', 'fid', 'mid', 'pids') def dehydrate_parent_id(self, person): return person.parent_id if person.parent else None
Дополнительно:
не нужно лепить все теги подряд, почитай правила
Ответы:
Давай за тебя открою и почитаю доки. На первый взгляд, https://django-import-export.readthedocs.io/en/lat... место где ты указываешь свою форму с выбором, а https://django-import-export.readthedocs.io/en/lat... и https://django-import-export.readthedocs.io/en/lat... места, где ты можешь попытаться отправить на почту
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы настроить экспорт на почту через админку Django, вам потребуется создать действие (action) для модели вашего объекта, которое будет отправлять данные на почту.
В начале необходимо импортировать необходимые модули:
from django.core.mail import EmailMessage from django.contrib import admin
Затем создайте функцию, которая будет выполнять отправку на почту: