程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了django ajax like button with css classes大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决django ajax like button with css classes?

开发过程中遇到django ajax like button with css classes的问题如何解决?下面主要结合日常开发的经验,给出你关于django ajax like button with css classes的解决方法建议,希望对你解决django ajax like button with css classes有所启发或帮助;

你好,我有一个帖子模型,它有一个 like(m2m) 和 user(forgeinkey) 模型字段,我试图检查 request.user 是否喜欢这个帖子,如果喜欢,我应该给他们看一个红心按钮否则应该显示一个蓝心,因为现在有多个帖子和喜欢,我循环遍历每个喜欢的对象以检查 request.user 是否喜欢它。不幸的是,由于某种原因,我无法实现一个好的逻辑,我看到每个用户都喜欢按钮。一些帮助将不胜感激。

这是我的模型:

class post(models.Model):
    user = models.ForeignKey(User,default='',related_name='has_liked',on_delete=models.CASCADE)
    caption = models.CharFIEld(max_length=100)
    image = models.fileFIEld(upload_to='images/',null=True,blank=TruE)
    vIDeo = models.fileFIEld(upload_to='vIDeos/',blank=TruE)
    created = models.datetiR_588_11845@eFIEld(auto_Now_add=TruE)
    like = models.ManyToManyFIEld(User,blank=True,default='')

视图:

@login_required
def usersFeed(request):
    users = User.objects.all()
    posts = post.objects.filter(Q(user__in=request.user.profile.frIEnd.all()) | Q(user=request.user)).order_by('-created')
    comments = Comment.objects.all()
    status_form = StatusForm(request.POST)
    frIEnd_requests = FrIEndrequest.objects.filter(to_user=request.user)
    frIEnds = request.user.profile.frIEnd.all()
    for i in posts:
        likes = i.like.all()
        print(likes)
        for like in likes:
            if like.username == request.user.username:
                if request.user:
                    Hasliked = True
                    print('liked')
                else:
                    Hasnotliked = True
                    print('not liked')
    context = {
        'Post':posts,'User':users,'form':PostForm(),'Profile':profile,'Form':CommentForm(),'Comment':comments,'Status':status_form,'fr':frIEnd_requests,'frIEnd':frIEnds,'Hasliked':Hasliked,'Hasnotliked':Hasnotliked,}
    return render(request,'social_media/Feed.HTML',context=context)

AJAX like counter 的视图:

@login_required
def like_post(request):
    Post = get_object_or_404(post,ID=request.GET.get('post_ID'))
    CSSClass = 'colorRed'
    if Post.like.filter(ID=request.user.ID).exists():
        Post.like.remove(request.user)
    else:
        Post.like.add(request.user)
    count = Post.like.count()
    users = Post.like.all() 
    user = []
    for i in users:
        user.append((i.userName))
    response = {
        'count':count,'users':user,'CSSClass':CSSClass,}
    return JsonResponse(responsE)

HTML 代码:

{% for i in Post %}
<form action="{% url 'like_post' %}" class='like-submit' data-catID="{{ i.ID }}" method="GET">
    <div class="like">
            {% if Hasliked == True %}
                <button ID="likeBtn{{ i.ID }}" class="likeClassBtn colorRed">
                    <i class="fas fa-heart"></i>
                </button>
            {% endif %}
            {% if Hasnotliked == True %}
                <button ID="likeBtn{{ i.ID }}" class="likeClassBtn">
                    <i class="fas fa-heart"></i>
                </button>                      
            {% endif %}
            <div class="show_likes">
            <span ID="likes_count{{ i.ID }}">{{ i.@R_528_10586@l_likes }}</span>
            <div class="username_liked">
                <div ID="user-likes{{ i.ID }}" class="user-likes">
                    {% for p in i.like.all %}
                    {{ p.username }}
                    {% endfor %}
                </div>
            </div>
            </div>
    </div>
</form>
{% endfor %}

<script>
    $(document).ready(function () {
            $(".like-submit").submit(function (event) {
                event.preventDefault()
                const url = $(this).attr('action');
                const catID = $(this).attr("data-catID");
                $.AJAX({
                        type: "GET",url: url,data: {
                            post_ID: catID,},success: function (data) {
                            $('#likes_count' + catID).HTML(data.count)
                            if ($('#user-likes' + catID).HTML()){
                                $('#user-likes' + catID).HTML(data.users + ' ')
                                $('#likeBtn' + catID).toggleClass(data.CSSClass)
                            }
                        }
                });
            });
    });
</script>

解决方法

您需要在该用户的帖子记录中存储 hasLiked/hasnotLiked。上面的代码意味着所有帖子都被喜欢或不喜欢。您还需要重新虑加载上下文的方式 - 当前代码效率极低。我建议用 id 数组替换 Hasliked 和 Hasnotliked 上下文条目,其中每个条目都包含当前用户喜欢/不喜欢的帖子的 ID。然后在模板中做检查:

{% if i.id in Hasliked %}   
  <button id="likeBtn{{ i.id }}" class="likeClassBtn colorRed">
    <i class="fas fa-heart"></i>   
  </button> 
{% endif %} 
{% if i.id in Hasnotliked %}   
  <button id="likeBtn{{ i.id }}" class="likeClassBtn">
    <i class="fas fa-heart"></i>   
  </button>
{% endif %}

喜欢、不喜欢的可以使用您当前的设置加载:

    friends = request.user.profile.friend.all()
    for i in posts:
        likes = i.like.all()
        print(likes)
        for like in likes:
            if like.username == request.user.username:
                if request.user:
                    Hasliked.append(i.id)
                    print('liked')
                else:
                    Hasnotliked.append(i.id)
                    print('not liked')

这将是非常低效的,最好的方法是直接查询数据库,并简单地返回 id:

l_likedPosts = PostActions.objects.filter(user_id=l_currUser,
喜欢=真)
.values_list('post_id',flat=TruE) Hasliked = list(l_likedPosts)

上面的代码假设您有一个表 PostActions,其中至少包含 user_id、post_id 和喜欢/不喜欢状态。这通常是 manytomany 字段在幕后为您做的事情,但在更复杂的数据模型中使用它需要太多的自由。

大佬总结

以上是大佬教程为你收集整理的django ajax like button with css classes全部内容,希望文章能够帮你解决django ajax like button with css classes所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。