#python #django
#python #django
Вопрос:
Я пытаюсь добавить оператор IF, чтобы при достижении количества лайков 2 отправлялось электронное письмо. Я написал коды, но это не работает, я пытаюсь использовать приведенное ниже, но оно не работает.
Мой вопрос в том, как добавить оператор if, чтобы при отправке любого элемента с лайками более 2 отправлялось конкретное электронное письмо.
Вот models.py
class Post(models.Model):
title = models.CharField(max_length=100, unique=True)
likes = models.ManyToManyField(
User, related_name='liked', blank=True)
def __str__(self):
return self.title
def total_likes(self):
return self.likes.count()
Вот views.py
class PostDetailView(DetailView):
model = Post
template_name = "post_detail.html"
def get_context_data(self, *args, **kwargs):
context = super(PostDetailView, self).get_context_data()
post = get_object_or_404(Post, slug=self.kwargs['slug'])
comments = Comment.objects.filter(
post=post, reply=None).order_by('-id')
total_likes = post.total_likes()
liked = False
if post.likes.filter(id=self.request.user.id).exists():
liked = True
if self.request.method == 'POST':
comment_form = CommentForm(self.request.POST or None)
if comment_form.is_valid():
content = self.request.POST.get('content')
reply_id = self.request.POST.get('comment_id')
comment_qs = None
if reply_id:
comment_qs = Comment.objects.get(id=reply_id)
comment = Comment.objects.create(
post=post, user=self.request.user, content=content, reply=comment_qs)
comment.save()
return HttpResponseRedirect("post_detail.html")
else:
comment_form = CommentForm()
context["total_likes"] = total_likes
context["liked"] = liked
context["comments"] = comments
context["comment_form"] = comment_form
return context
def get(self, request, *args, **kwargs):
res = super().get(request, *args, **kwargs)
self.object.incrementViewCount()
return res
def LikeView(request):
# post = get_object_or_404(Post, id=request.POST.get('post_id'))
post = get_object_or_404(Post, id=request.POST.get('id'))
liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
liked = False
else:
post.likes.add(request.user)
liked = True
context = {
'total_likes': post.total_likes,
'liked': liked,
'post': post
}
if post.likes.count() == 2:
msg = EmailMessage('Count Reached',
settings.EMAIL_HOST_USER, [request.user.email])
msg.content_subtype = "html" # Main content is now text/html
msg.fail_silently = False
msg.send()
if request.is_ajax:
html = render_to_string('like_section.html', context, request=request)
return JsonResponse({'form': html})
Комментарии:
1. что вы пробовали и где потерпели неудачу
2. @iklinac обновленный вопрос с пробной версией
Ответ №1:
Если вы хотите, чтобы это происходило везде, я бы рекомендовал добавить переопределение к save()
методу Post
модели и отправить электронное письмо туда, когда оно увеличится до двух лайков. Вы также можете использовать send_mail
функцию Django, которая является хорошей оболочкой для отправки электронной почты. Толстые модели, тощие просмотры, тупые шаблоны — это мантра для лучших практик Django. Может быть, что-то вроде этого:
from django.core.mail import send_mail
class Post(models.Model):
title = models.CharField(max_length=100, unique=True)
likes = models.ManyToManyField(
User, related_name='liked', blank=True)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
if self.total_likes() == 2:
send_mail(
"my subject",
"my text message",
"myemail@myhost.com",
["myuser@theirhost.com"],
html_message="<h1>My HTML Message</h1>",
)
super().save(*args, **kwargs)
def total_likes(self):
return self.likes.count()
Удачи!
Комментарии:
1. разве это не должно быть
if self.total_likes()
вместоif self.likes
?2.Да, вы правы! Тем не менее, я бы рекомендовал создать a
total_likes
models.IntegerField
вPost
модели и увеличивать на единицу каждый раз, когда вы добавляете связанную строкуlikes
. В долгосрочной перспективе это будет намного дешевле для поиска тривиального количества места на сообщение.3. Я бы этого не сделал. Есть вероятность, что мы могли забыть обновить счетчик при добавлении или удалении элементов из отношения M2M.
4. В любом случае. Просто имейте в виду, если у вас много строк в реляционной таблице, вы увидите значительное замедление. Но это можно решить в будущем. Приветствия.