我有一个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
但在这里我想从序列化器/模型传递属性,用户提供,我尝试传递序列化程序,并访问其属性,但我不知道该怎么做这是正确的方法
你可以在这一行之后访问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