ゆーじぇいブログ

ゆーじぇいブログ

プログラミングとか色々

[Django]いいね機能を実装する

f:id:jyouj:20181124165234j:plain

 最近、色々と作らなくてはならないものが溜まっていてブログを書けていませんでしたが、気分転換に書いてみようかなーと思った次第です。SNSで重要になるいいね機能を作っていこうと思います。最初うまくいかなかったのですが、優しい人に助けられて形になりました!

 使用したもの:python3.6
        Django1.11

 参考にした本

いいね機能

 models.pyにはUserモデルや投稿モデルと紐づけておきます。

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='voice_user')
    text = models.TextField(blank=False)
    date_created = models.DateTimeField(auto_now_add=True)
    like_num = models.IntegerField(default=0)

    class Meta:
        ordering = ['-date_created']

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='like_user')
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)

 views.pyには

@login_required
def like(request, *args, **kwargs):
    post = Post.objects.get(id=kwargs['post_id'])
    is_like = Like.objects.filter(user=request.user).filter(post=post).count()
    # unlike
    if is_like > 0:
        liking = Like.objects.get(post__id=kwargs['post_id'], user=request.user)
        liking.delete()
        post.like_num -= 1
        post.save()
        messages.warning(request, 'いいねを取り消しました')
        return redirect(reverse_lazy('posts:post_detail', kwargs={'post_id': kwargs['post_id']}))
    # like
    post.like_num += 1
    post.save()
    like = Like()
    like.user = request.user
    like.post = post
    like.save()
    messages.success(request, 'いいね!しました')
    return HttpResponseRedirect(reverse_lazy('posts:post_detail', kwargs={'post_id': kwargs['post_id']}))

 
 投稿詳細ページはあらかじめ作っておく。
 urls.pyに記述する。

urlpatterns = [
    url(r'^(?P<post_id>[0-9]+)/like/$', views.like, name='like'),
]

 投稿詳細のテンプレートにこちらを記入!

<a href="{% url 'posts:like' voice.id %}">いいね!</a>{{ post.like_num }}

 これで動きました!

 何かありましたらこちらに:じぇい👨‍💻(@jyouj__)さん | Twitter

投げ銭もお待ちしてまーす! -> jyouj__さんの投げ銭ビスケット募集中!