将Model对象从视图集传递到函数中

问题描述 投票:0回答:1

我有一个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='[email protected]',
    recipient_list=['[email protected]'],
    html_message= htmly.render(d)
)

现在我只有一个样本占位符作为d但在这里我想从序列化器/模型传递属性,用户提供,我尝试传递序列化程序,并访问其属性,但我不知道该怎么做这是正确的方法

django email serializer
1个回答
1
投票

你可以在这一行之后访问response.data

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

它将保存序列化程序的数据。然而,如果你想要一个模型的实际实例,这将是不够的,你将需要破解你的方式一点点。在django-rest-framework的CreateModelMixin中使用的ModelViewSet具有以下方法:

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
© www.soinside.com 2019 - 2024. All rights reserved.