[Django]いいね機能を実装する
最近、色々と作らなくてはならないものが溜まっていてブログを書けていませんでしたが、気分転換に書いてみようかなーと思った次第です。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__さんの投げ銭ビスケット募集中!