Получить письмо текущего получателя, Django - PullRequest
1 голос
/ 02 февраля 2020

Я создаю приложение для блога, используя django. Это простой блог, поэтому в нем нет функции входа в систему, но люди могут оставлять комментарии к сообщениям, используя электронную почту. И вещи go что-то вроде этого:

1- Пользователь оставляет комментарий к сообщению.
2- После того, как комментарий сохранен, Пользователь добавляется в список подписки этого сообщения (только если они еще не в этом списке), чтобы я мог уведомить их, когда новые комментарии будут добавлены в пост.
3- Отправляйте электронные письма людям из списка подписки, уведомляя их о новом комментарии, и вместе с электронным письмом есть ссылка, позволяющая людям отказаться от подписки на получение дальнейших электронных писем.

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

def unsubscribe_from_post(request, slug, email): #I don't how to know the email of the recipient to  pass it
    post = Post.objects.get(slug=slug)           #to this function without asking them to write it down
    post.recipients.filter(recipient_email=email).delete()   

в models.py

class Post(models.Model):
title    = models.CharField(max_length=120)
body     = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
categories = models.ManyToManyField('Category', related_name= 'posts')
slug = models.SlugField(null=True)
recipients = models.ManyToManyField('Recipient') 

def __str__(self):
    return self.slug

def get_absolute_url(self):
    return reverse('blog:post_detail_view', kwargs={'slug': self.slug})  

class Recipient(models.Model):
    recipient_email = models.EmailField()

   def __str__(self):
       return self.recipient_email

в views.py

def post(self, request, *args, **kwargs):
    ''' Hadnel the http POST method '''  
    post = self.get_queryset(**kwargs)[0]
    self.object = self.get_object()  

    comment_form = CommentForm(request.POST)

    if comment_form.is_valid():
        email = comment_form.cleaned_data["email"]
        name = comment_form.cleaned_data["name"]
        comment_msg= comment_form.cleaned_data["comment"]
        comment = Comment(name=name,
                          email= email,
                          comment=comment_msg,
                          post=post,
                          )
        comment.save()

        set_of_recipients = set(
                 recipient.recipient_email for recipient in post.recipients.all() if recipient.recipient_email != email
                 )

        if set_of_recipients:
           self.notify_recipients_of_new_comment(set_of_recipients, post, name, comment_msg)

        if email not in post.recipients.all():
           self.add_new_recipient(post, email) 

    return render(request, self.template_name, self.get_context_data(**kwargs))                    

def notify_recipients_of_new_comment(self, set_of_recipients, post, name, comment):
    from django.core.mail import EmailMultiAlternatives
    from django.template import loader
    subject = "A new comment from Voila"
    html_template = loader.get_template('blog/email-template.html')
    context = {
        "name": name,
        "post": post,
        "comment": comment,
    }
    text_content = "hello there"
    html_content = html_template.render(context)
    msg = EmailMultiAlternatives(subject, text_content, "zzanjabeel7@gmail.com", set_of_recipients)
    msg.attach_alternative(html_content, "text/html")
    return msg.send() 

def add_new_recipient(self, post, email):
    recipient = Recipient(recipient_email=email)
    recipient.save()
    post.recipients.add(recipient)

в urls.py

path('unsubscribe/<slug>', views.unsubscribe_from_post, name= "unsubscribe_from_post_view") 

в темп. . html

<h2>To unsubscribe <a href="http://localhost:8000{% url 'blog:unsubscribe_from_post_view' post.slug %}">click here</a></h2>

Большое спасибо.

...