为了账号安全,请及时绑定邮箱和手机立即绑定

Django通知电子邮件给ManyToMany关系中的用户

Django通知电子邮件给ManyToMany关系中的用户

泛舟湖上清波郎朗 2021-04-02 19:15:33
我想在创建新帖子时将通知电子邮件发送到在“观察者” ManyToMany字段中定义的用户列表。该帖子的创建没有错误,并且观察者用户列表已成功添加到该帖子中(它们出现在post_detail.html模板中),但是通知电子邮件从未发送给该观察者用户。我认为我在下面的new_post函数中做错了事,我将此代码改编 为当用户对帖子发表评论时就可以发送电子邮件,这确实有效。任何帮助,不胜感激。models.py(相关部分):from django.db import modelsfrom django.contrib.auth.models import Userfrom django.contrib.sites.models import Sitefrom django.db.models import signalsfrom notification import models as notificationclass Post(models.Model):    author = models.ForeignKey(User, related_name="added_posts")    observers = models.ManyToManyField(User, verbose_name=_("Observers"), related_name='observers+', blank=True, null=True)# send notification to Post observersdef create_notice_types(app, created_models, verbosity, **kwargs):    notification.create_notice_type("new_post", "New post created", "A new post has been created")signals.post_syncdb.connect(create_notice_types, sender=notification)def new_post(sender, instance, created, **kwargs):       context = {        'observer': instance,        'site': Site.objects.get_current(),    }    recipients = []    pk=instance._get_pk_val()    for observer in instance.observers.all().distinct():        if observer.user not in recipients:            recipients.append(observer.user)    notification.send(recipients, 'new_post', context)signals.post_save.connect(    new_post, sender=models.get_model(    'blog', 'Post'), dispatch_uid="pkobservers")views.py(相关部分):@login_requireddef add(request, form_class=PostForm, template_name="blog/post_add.html"):    post_form = form_class(request)    if request.method == "POST" and post_form.is_valid():        post = post_form.save(commit=False)        post.author = request.user        post_form.save()        post_form.save_m2m()        return redirect("blog_user_post_detail",             username=request.user.username, slug=post.slug)    return render_to_response(template_name,         {"post_form": post_form}, context_instance=RequestContext(request))
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

首先,我认为您的多对多关系不应为空或为空,因为理想情况下,每个观察者都是用户,而不是无。这样可以避免尝试向无用户发送电子邮件,这可能会导致错误。

其次,我认为您可以使用

recipients = instance.observers.all().distinct()

而不是在列表上循环(distinct()已仅考虑唯一用户)

第三,我不明白为什么您真正需要一个“ distinct()”:用户可以多次成为观察者吗?

recipients = instance.observers.all()

第四,在您的代码中,将通过instance.observers.all()循环到一个已经是User的“ observer”。为什么要在收件人中附加observer.user?我认为追加观察者就足够了。

最后,确认收件人不为空。如果您已经测试了notification.send(),则您的代码似乎正确。


查看完整回答
反对 回复 2021-04-06
  • 2 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信