Передача объектов модели в функцию из набора - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть набор представлений Django, где у меня есть функция, которая отправляет электронное письмо при каждом использовании набора.

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

Я хочу передать некоторые аргументы функции для отображения в электронном письме (сделано с помощью движка шаблонов Django)

class ContactRequestViewSet(viewsets.ModelViewSet):
queryset = ContactRequest.objects.all()
permission_classes = [
    permissions.AllowAny
]
serializer_class = ContactRequestSerializer

def create(self, request, *args, **kwargs):
    response = super(ContactRequestViewSet, self).create(request, *args, **kwargs)
    send_email()
    return response

#function to send email
def send_email():
htmly = get_template('email.html')
d = {'company_name': 'dodo'} #i want this dictionary, to contain the attributes from the viewset
send_mail(
    subject='Test email',
    message='',
    from_email='test@email.com',
    recipient_list=['test@email.com'],
    html_message= htmly.render(d)
)

прямо сейчас у меня просто образец заполнителя как d но здесь я хочу передать атрибуты из сериализаторов / модели, предоставленные пользователем, я попытался передать сериализатор и получить доступ к его атрибутам, но я не знаю, как это сделать правильно

1 Ответ

1 голос
/ 16 апреля 2019

Вы можете получить доступ к response.data после этой строки

response = super(ContactRequestViewSet, self).create(request, *args, **kwargs)

, в которой будут храниться данные сериализатора.Тем не менее, если вам нужен реальный экземпляр вашей модели, этого будет недостаточно, и вам придется немного взломать свой путь.CreateModelMixin, используемый в ModelViewSet django-rest-framework, имеет следующие методы:

class CreateModelMixin:
    # ... more stuff here

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

, поэтому вы можете переопределить метод perform_create, чтобы сохранить экземпляр в атрибуте вашего ContactRequestViewSet вот так:

def perform_create(self, serializer):
    self.instance = serializer.save()

тогда в методе create вы можете сделать что-то вроде этого:

def create(self, request, *args, **kwargs):
    response = super(ContactRequestViewSet, self).create(request, *args, **kwargs)  # This calls perform_create internally
    send_email(self.instance)
    return response
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...