Не могу вывести имя пользователя при получении рассылки на почту
Делаю новостной сайт. Есть статьи и категории. Использую для рассылки django-sheduler. Идея заключается в том чтобы при еженедельной рассылке вместе с новыми статьями за неделю, в шаблоне реализовать вывод обращения к конкретному пользователю. То-есть мне видится это так: Есть email'ы пользователей которые зарегистрированы на сайте (использую django-allauth). У меня получилось сделать так что приходят имена всех подписанных пользователей. То есть выглядит это:
Здравствуй {'Amanda', 'raingts5', 'admin', 'raingts'}. Новые статьи за последнюю неделю!
Классический Range Rover оснастили электроустановкой от Tesla
Mercedes-Benz представил абсолютно новый E-Class
В России заметно подорожал импорт подержанных электромобилей
итд...
Мне нужно сделать чтобы условно сверялся пользователь с емейлом при регистрации и приветствие индивидуализировалось, а не выводились все имена пользователей подписавшихся на категории на сайте.
models.py
---
from django.contrib.auth.models import User
from django.db import models
from django.db.models import Sum
from django.urls import reverse
from news.resources import *
class Author(models.Model):
author_user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='Автор')
rating_user = models.IntegerField(default=0, verbose_name='Рейтинг')
class Meta:
verbose_name = 'Автор'
verbose_name_plural = 'Авторы'
def update_rating(self):
rating_posts_author = Post.objects.filter(author_post=self).aggregate(Sum('rating_post')).get(
'rating_post__sum') * 3
rating_comments_author = Comment.objects.filter(user_comment=self.author_user).aggregate(
Sum('rating_comment')).get('rating_comment__sum')
rating_comments_posts = Comment.objects.filter(post_comment__author_post=self.id).aggregate(
Sum('rating_comment')).get('rating_comment__sum')
self.rating_user = rating_posts_author + rating_comments_author + rating_comments_posts
print(self.rating_user)
self.save()
def __str__(self):
return f'{self.author_user}'
class Category(models.Model):
title_category = models.CharField(max_length=255, unique=True, verbose_name='Название новости или статьи')
subscribers = models.ManyToManyField(User, related_name='categories')
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
def __str__(self):
return self.title_category
class Post(models.Model):
title_post = models.CharField(max_length=255, verbose_name='Название')
text_post = models.TextField(verbose_name='Текст')
author_post = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='Автор')
choice_post = models.CharField(max_length=7, choices=CATEGORY, verbose_name='Выбор публикации')
date_post = models.DateTimeField(auto_now_add=True, verbose_name='Дата')
categories_post = models.ManyToManyField(Category, through='PostCategory')
rating_post = models.IntegerField(default=0, verbose_name='Рейтинг')
class Meta:
verbose_name = 'Публикация'
verbose_name_plural = 'Публикации'
def like(self):
self.rating_post += 1
self.save()
def dislike(self):
self.rating_post -= 1
self.save()
def preview(self):
if len(self.text_post) <= 124:
return self.text_post
else:
return self.text_post[0:124] + '...'
def __str__(self):
return f"{self.title_post} {self.text_post} {self.author_post}"
def get_absolute_url(self):
return reverse('news', args=[str(self.pk)])
class PostCategory(models.Model):
post_category = models.ForeignKey(Post, on_delete=models.CASCADE, verbose_name='Публикация')
category_post = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='Категория')
class Meta:
verbose_name = 'Категория публикации'
verbose_name_plural = 'Категории публикаций'
def __str__(self):
return f'{self.post_category} {self.category_post}'
class Comment(models.Model):
post_comment = models.ForeignKey(Post, on_delete=models.CASCADE, verbose_name='Публикация')
user_comment = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Автор')
text_comment = models.TextField(default='', verbose_name='Текст')
date_comment = models.DateTimeField(auto_now_add=True, verbose_name='Дата')
rating_comment = models.IntegerField(default=0, verbose_name='Рейтинг')
class Meta:
verbose_name = 'Комментарий'
verbose_name_plural = 'Комментарии'
def like(self):
self.rating_comment += 1
self.save()
def dislike(self):
self.rating_comment -= 1
self.save()
runapsheduler.py
---
def my_job(): # TODO индивидуализировать сообщение на почту (добавить имя пользователя)
today = datetime.datetime.now()
last_week = today - datetime.timedelta(days=7)
posts = Post.objects.filter(date_post__gte=last_week)
users = Post.objects.values_list('categories_post__subscribers', flat=True)
get_username = set(Category.objects.filter(subscribers__in=users).values_list('subscribers__username', flat=True))
categories = set(posts.values_list('categories_post__title_category', flat=True))
subscribers = set(
Category.objects.filter(title_category__in=categories).values_list('subscribers__email', flat=True))
html_content = render_to_string('weekly_news.html',
{'link': settings.SITE_URL, 'posts': posts, 'get_username': get_username})
msg = EmailMultiAlternatives(subject='Статьи за неделю!', body='', from_email=settings.DEFAULT_FROM_EMAIL,
to=subscribers)
msg.attach_alternative(html_content, 'text/html')
msg.send()
шаблон
---
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>Здравствуй {{ get_username }}. Новые статьи за последнюю неделю!</h2>
<ul>
{% for post in posts %}
<li><a href="{{ link }}{{ post.get_absolute_url }}">{{ post.title_post }}</a> </li>
{% endfor %}
</ul>
</body>
</html>