首页 > 解决方案 > 喜欢不喜欢使用自定义模板标签切换

问题描述

我希望按钮内的文本在喜欢和不喜欢之间切换。我正在尝试使用自定义模板标签来完成此操作。喜欢和不喜欢正在起作用,模型正在更新。只想让按钮在喜欢和不喜欢之间切换!

我已经创建了模板标签文件夹。只需要帮助在 post_extras.py 中创建模板标签函数以及如何在模板中调用该函数

post_extras.py

    from django import template

    register = template.Library()


    @register.simple_tag(takes_context=True)
    def isliked(context,entry):
    if entry.filter(id=context['request'].post.id).exists():
      return "Unlike"
    else:
      return "Like"

like_section.html

    {% load post_extras %}
    {{ entry.total_likes }} Like{{ entry.total_likes | pluralize }}
    <form action="{% url 'like_post' %}" method="POST">
    {% csrf_token %}
    <input type="submit" name="{{ entry.id }}" value="like" class="btn 
    btn-primary like"/>
    </form>

模型.py

    class Post(models.Model):
    user= models.ForeignKey(User, on_delete=models.CASCADE)
    heading = models.CharField(max_length=200, null=False)
    text = models.TextField(null=False)
    created_date=models.DateTimeField(default=timezone.now)
    pic = models.ImageField(upload_to='image', blank='True')

    def __str__(self):
        return self.heading



    def getuser(self):
        return self.user.username

    def total_likes(self):
        return Like.objects.filter(post=self).count()



    class Like(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    post = models.ForeignKey(Post,on_delete=models.CASCADE)

    def __str__(self):
        return self.post.heading

阿贾克斯代码:

   $(document).on('click','.like',function(e) {
   e.preventDefault();
   var pks=$(this).attr('name');
   console.log('primarys : '+ pks);
   $.ajax({
   type:'POST',
   url:'like/',
   data:{
   'ids': pks,
   csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
   },
   success:function (response) {
   $(e.target).parents('.like-section').html(response);
   console.log(response)
   console.log("liked");
   },
   error: function(rs,e){
        console.log(rs, e.responseText);
        console.log('ERROR');
   },
   });
   });

视图.py

def like_post(请求):

post = get_object_or_404(Post, id=request.POST.get('ids'))
like=Like.objects.filter(user=request.user, post=post)
if like.exists():
    like.delete()
else:
    Like.objects.create(user=request.user, post=post)
    send_mail(
        'Post Liked',
        'Your Post "'+ post.heading + '" has been liked by '+request.user.username,
        'mohitharshan123@gmail.com',
        [post.user.email],
        fail_silently=False,
    )
context= {
      'entry': post,
     }
if request.is_ajax():
        html = render_to_string('accounts/like_section.html', context, request=request)
        return HttpResponse(html)

标签: pythondjango

解决方案


据我了解,帖子Liked是否存在于Like模型中。

解决方案

from django import template

# import `Like` model
from path.to.models import Like

register = template.Library()

@register.simple_tag
def isliked(post):
    if Like.objects.filter(post=post).exists():
        return "Like"
    return "Unlike"

然后,您可以将其加载到模板中:{% load isliked %}.
并且,然后通过传递Post模型实例来使用它:{% isliked post %}


推荐阅读