【问题标题】:Django Like function with ajax带有ajax的Django Like函数
【发布时间】:2019-01-17 05:26:57
【问题描述】:

首先:我已经检查了所有相关的答案和问题......他们没有帮助我

所以我正在尝试创建基于 ajax 的按钮,其中包含多个用户和多个对象或帖子我尝试了很多但它们都不起作用但我有基础

models.py:

class BlogPost(models.Model):
    #some fields

class Like (models.Model):
    user = models.ForeignKey(User)
    post = models.ForeignKey(BlogPost)

views.py

from .models import Like
def PostLikeToggle(request):
    #here i want to capture the request check if the user liked the post or
    # no by sending user.username and post.title to the endpoint like.html
    #and then update his status
    return render(request, 'like.html')

urls.py

from plateform import views as plateform
urlpatterns = [
    #other urls
    url(r'^like/', plateform.PostLikeToggle,  name='PostLikeToggle'),]

like.html

 {% if liked == 'false' %}
    false
  {% elif liked == 'true' %}
    true
  {% endif %}

blogpost.html

#ajax

  $('.thumb').click(function () {
            $.ajax({
                type: 'POST',
                url: '/like/',
                data: {
                    'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val(),
                },
                success: LikePost,
                dataType: 'html'
            });

            function LikePost(data, jqXHR) {
                    console.log(data)
                }
        });

更新 我试图弄清楚所以我添加了一些东西

型号:

class BlogPost(models.Model):
        #some fields
        liked = models.ManyToManyField(User, related_name='PostLikeToggle')

    #REMOVED class Like (models.Model)

观看次数:

def PostLikeToggle(request):
    user = request.user
    if request.method == 'POST':
        post_id = request.POST['post_id']
        post = get_object_or_404(posts, id=post_id)
        _liked = user in post.liked.all()
        if _liked :
            post.liked.remove(user)
        else:
            post.liked.add(user)

    return JsonResponse({'liked':_liked})

那么我是不是走对路了??

【问题讨论】:

  • 您需要在请求中添加额外的数据:您想要喜欢的对象。
  • 您应该发布不起作用的代码,以便我们帮助您调试它,现在看起来您只是希望其他人为您完成完整的实现。
  • 您需要想出一种方法,在帖子不喜欢后软删除 LIKE 或删除 LIKE 本身的行。此外,作为提示,您需要两件事来唯一识别 LIKE - UserId 和 PostId
  • 我是否需要在博客文章中创建一个外部字段并删除类似的模型,所以如果用户单击按钮我添加他
  • 请查看我的更新

标签: python ajax django django-views endpoint


【解决方案1】:

好吧,我只是发布我的答案....这是很简单的把戏,但我有点小气...

在模型文件中,我添加了用户关系的多对多字段(许多用户+许多帖子)

class BlogPost(models.Model):
    #more fields
    liked = models.ManyToManyField(User, related_name='PostLikeToggle')

在视图中,我创建了视图,它将接受来自博客帖子视图的请求并检查用户是否已经喜欢该帖子(如果喜欢则将用户添加到喜欢的字段,如果喜欢返回 true,则删除它,如果 ....)

def PostLikeToggle(request):
    user = request.user
    if request.method == 'POST':
        post_id = request.POST['post_id']
        post = get_object_or_404(posts, id=post_id)
        _liked = user in post.liked.all()
        if _liked :
            post.liked.remove(user)
        else:
            post.liked.add(user)

    return JsonResponse({'liked':_liked})

此视图与我们将获得响应的 url 相关联:

url(r'^like/', plateform.PostLikeToggle,  name='PostLikeToggle') 

在您的博客文章模板中,您需要链接 Jquery 并添加此 Ajax 函数 (别忘了用你自己的变量类自定义它,url ...

$('.thumb').click(function () {
            $.ajax({
                type: 'POST',
                url: {% url 'PostLikeToggle' %},
                data: {
                    'post_id': {{ post_slug.id }},
                    'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val(),
                },
                success: LikePost,
                dataType: 'html'
            });

            function LikePost(data, jqXHR) {
                var data = $.parseJSON(data)
                if (data['liked']) {
                    $('.thumb').removeClass("fas fa-thumbs-up").addClass('far fa-thumbs-up')
                }
                else
                    {
                        $('.thumb').removeClass("far fa-thumbs-up").addClass('fas fa-thumbs-up')
                    }


            }
        });

如果有任何异常或者你有更好的方法发布它,我会标记它

注意:您必须检查用户是否在模板中通过身份验证以隐藏点赞按钮或将他重定向到登录 ....

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 2020-10-29
    • 2017-08-24
    • 1970-01-01
    • 2020-03-04
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多