Добавление инструкции `if` для отправки электронного письма, когда количество лайков достигает определенного значения Нет

#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. В любом случае. Просто имейте в виду, если у вас много строк в реляционной таблице, вы увидите значительное замедление. Но это можно решить в будущем. Приветствия.