Я создаю приложение для блога, используя 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>
Большое спасибо.