aal*_*333 3 python django django-rest-framework
Django 2.0,Python 3.6,Django Rest Framework 3.8
我对Django Rest Framework还是很陌生,并且我试图将自己的观点围绕在视图集中使用函数的逻辑(如果这是包含函数的正确位置)。
基本上,当用户在此特定视图集中向api发布内容时,我想发送一封电子邮件。我尝试使用该send_mail功能,但未成功。我有以下基于类的视图:
class SendInviteView(viewsets.ModelViewSet):
queryset = models.Message.objects.all()
serializer_class = serializers.MessageSerializer
@action(methods=['post'], detail=True)
def send_the_mail(self, request):
send_mail(
'Invitation',
'Try our app!',
'exampleemail@gmail.com',
['examplerecipient@gmial.com'],
fail_silently=False,
)
Run Code Online (Sandbox Code Playgroud)
[模型和序列化器是非常基本的,对于这个问题,我认为不需要,基本上只是一个EmailField()。我最终计划使用该电子邮件字段的输入来替换examplerecipient@gmail.com,但现在我只想了解如何向视图集添加功能]
运行时导致错误 python manage.py check
我已经通过sendgrid设置了电子邮件客户端,并且能够成功地将电子邮件发送给要求通过重置密码的用户rest-auth,但是我不了解在这种情况下如何发送电子邮件。
任何帮助是极大的赞赏。
讨论之后,我将提出以下建议。
from django.conf import settings
from django.core.mail import send_mail
from django.db import models
from rest_framework import serializers, viewsets, routers, mixins
from rest_framework.response import Response
class Message(models.Model):
sender = models.ForeignKey(settings.AUTH_USER_MODEL)
recipient = models.EmailField()
class MessageSerializer(serializers.ModelSerializer):
message = serializers.CharField(write_only=True)
class Meta:
model = Message
fields = ['recipient', 'message']
def create(self, validated_data):
message = validated_data.pop('message')
message_obj = super().create(validated_data)
send_mail(
'Invitation',
message,
'exampleemail@gmail.com',
[message_obj.recipient]
)
return message_obj
class SendInviteView(mixins.CreateModelMixin, viewsets.GenericViewSet):
serializer_class = MessageSerializer
def perform_create(self, serializer):
serializer.save(sender=self.request.user)
router = routers.DefaultRouter()
router.register('send_invite', SendInviteView, base_name='send_invite')
urlpatterns = router.urls
Run Code Online (Sandbox Code Playgroud)
让我们分手吧。
如果你想存储发送者,你需要ForeignKey给User你的模型。
对于序列化程序,您需要message手动添加字段,因为模型中不存在该字段,但用户应提交该字段。我们将其设置为只写,因为此序列化程序还将用于将创建的序列化序列Message返回给用户以进行响应,并且 Message没有message字段。该序列化器还将为模型recipient自动生成字段Message。
然后,我们create在此序列化程序中进行覆盖,因此无论何时Message使用它创建新的序列化程序,它都会发送一封电子邮件。它会调用super().create(..)以实际保存Message到数据库,然后发送电子邮件。我们使用.pop(),除去message从validated_data,因为Message不包含这样的字段。
对于视图,我们不需要ModelViewSet提供的全部内容。它增加了创建,读取,更新和删除(CRUD)您的功能Message,而实际上并不需要。您只需要简单的Create即可将其转换为POSTHTTP请求。GenericViewSet与CreateModelMixin正是我们想要的东西(而实际上ModelViewSet只是有更多的混入)。来自用户的数据将由序列化程序验证,然后perform_create将调用方法。我们要传递sender=self.request.user到,serializer.save()因为我们需要保存sender到中Message,并且sender字段实际上不在数据中,它是当前登录的用户。
serializer.save()将运行我们,MessageSerializer.create()所以我们很高兴。
请注意,这些内容仅适用于登录用户,因为我们需要以某种方式填充sender数据库中的字段,因此添加将是正确的
class SendInviteView(mixins.CreateModelMixin, viewsets.GenericViewSet):
permission_classes = [IsAuthenticated]
....
Run Code Online (Sandbox Code Playgroud)
因此,只有经过身份验证的用户才能发出请求。希望这会为您澄清事情。最好的祝福)
| 归档时间: |
|
| 查看次数: |
5473 次 |
| 最近记录: |