Как сделать экспорт на почту через админку Django?

Ссылка скопирована
1 ответ

Есть небольшой проект с единственной моделью, есть функция экспорта и импорта данных через админку. Хочу добавить что-то по типу кнопки или галачки с выбором "отправить на компьютер или письмо". С указанием почты. Как это можно сделать?

админка:

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... места, где ты можешь попытаться отправить на почту

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Артём Dev Ответ

Для того чтобы настроить экспорт на почту через админку Django, вам потребуется создать действие (action) для модели вашего объекта, которое будет отправлять данные на почту.

В начале необходимо импортировать необходимые модули:

from django.core.mail import EmailMessage
from django.contrib import admin

from django.core.mail import EmailMessage from django.contrib import admin

Затем создайте функцию, которая будет выполнять отправку на почту:

def export_to_email(modeladmin, request, queryset):
subject = 'Экспорт данных'
message = 'Данные для экспорта:

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно