質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1952閲覧

Djagnoでuserがいいねしたかどうかで表示を変えられず四苦八苦しています。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/21 08:33

編集2020/05/21 11:00

Djandoでいいね機能を実装しました。主な実装箇所は以下の通りです。
いいねをするとメッセージにより、いいねをしました。いいねを取り消しました。との表示をさせる事には成功したのですが、テンプレート側の表示、「いいねをする」を「いいねをした」に変えたいのですが、あるユーザーがいいねしたかどうかを判別する方法が分かりません。
view側の「is_like」を渡す方法も探したのですが、結局は分かりませんでした。
どなたかアドバイスお願いします。

model.py

python

1class Post(models.Model): 2 user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='voice_user') 3 text = models.TextField(blank=False) 4 date_created = models.DateTimeField(auto_now_add=True) 5 like_num = models.IntegerField(default=0) 6 7class Like(models.Model): 8 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='like_user') 9 post = models.ForeignKey(Post, on_delete=models.CASCADE) 10 date_created = models.DateTimeField(auto_now_add=True)

views.py

python

1@login_required 2def like(request,post_id): 3 post = Post.objects.get(id=post_id) 4 is_like = Like.objects.filter(user=request.user).filter(post=post).count() 5 # unlike 6 if is_like > 0: 7 liking = Like.objects.get(post__id=post_id, user=request.user) 8 liking.delete() 9 post.like_num -= 1 10 post.save() 11 messages.warning(request, 'いいねを取り消しました') 12 return redirect ('post:post_detail', pk=post.pk) 13 # like 14 post.like_num += 1 15 post.save() 16 like = Like() 17 like.user = request.user 18 like.post = post 19 like.save() 20 messages.success(request, 'いいね!しました') 21 return redirect ('post:post_detail', pk=post.pk)

post_detail.html

python

1 {% for message in messages %} 2 <p> {{ message }}</p> 3 {% endfor %} 4 <a href="{% url 'post:like' post.id %}">いいねする</a>

views.py

python

1class PostDetailView(DetailView): 2 model = Post 3 4 def get_object(self, queryset=None): 5 obj = super().get_object(queryset=queryset) 6 if not obj.is_public and not self.request.user.is_authenticated: 7 raise Http404 8 return obj

urls.py

python

1path('<slug:post_id>/like/', like, name='like'), 2path('post/<slug:pk>/', PostDetailView.as_view(), name='post_detail'),

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Python

1class PostDetailView(DetailView): 2 model = Post 3 4 def get_object(self, queryset=None): 5 obj = super().get_object(queryset=queryset) 6 if not obj.is_public and not self.request.user.is_authenticated: 7 raise Http404 8 return obj 9 def get_context_data(self, **kwargs): 10 context = super().get_context_data(**kwargs) 11 context['check'] = Like.objects.filter(user=self.request.user, post=self.kwargs.get('pk')).exists() 12 return context

HTML

1{% for message in messages %} 2 <p> {{ message }}</p> 3{% endfor %} 4{% if check == False %} 5 <a href="{% url 'post:like' post.id %}">いいねする</a> 6{% else %} 7 <a href="{% url 'post:like' post.id %}">いいね済み</a> 8{% endif %} 9```これでいいのでは? 10 11要は、userがログインユーザーで、postがdetailのもののテーブルが、あるかないかが分かればいいんですよね。てことは 12Like.objects.filter(user='ログインユーザー', post='投稿').exists() 13でTrueかFalseが返ります。

投稿2020/05/21 09:35

編集2020/05/21 11:05
ForestSeo

総合スコア2720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/21 11:01

ご丁寧にありがとうございます。 urls.pyを追記させて頂きました。
退会済みユーザー

退会済みユーザー

2020/05/21 11:09

思い通りの動作をしました。とても助かりました。 ありがとうございました。
ForestSeo

2020/05/21 11:10

良かったです。
退会済みユーザー

退会済みユーザー

2020/05/22 02:44

度々すいません。上記でログインせずに、詳細ページにアクセスすると、'AnonymousUser' object is not iterableと表示されてしまいます。 class PostDetailView(LoginRequiredMixin, DetailView): とLoginRequiredMixinを追加すれば、未ログインの場合はログイン画面に移動させる事でエラーは回避できるのですが、詳細ページ自体は未ログインユーザーにも表示させたいです。どうしたら良いでしょうか?
ForestSeo

2020/05/22 02:57

ifで、未ログインの場合いいねボタンそのものを消すとかでしょうか? 例えば、ログインしてるかどうかを変数に入れてテンプレートに渡し、ログインしていたら[いいねする]や[いいね済]のボタンを表示し、ログインしていなかったらなにも表示しないとか。
退会済みユーザー

退会済みユーザー

2020/05/22 04:50

ClassViewの使い方がまだ理解出来ておらず、テンプレート側で{% if request.user.is_authenticated %}を追加し、ログインしているかを確認しようと思ったのですが、ダメでした。やはりview側で処理しないとダメなのですね。
ForestSeo

2020/05/22 06:16

そうですね。 例えば(試してないですけど) if request.user == "AnonymousUser" とかできるかもしれません。
退会済みユーザー

退会済みユーザー

2020/05/22 08:18

アドバイスありがとうございます。 色々と試行錯誤してみます。また、何か分かりましたら教えて頂けると助かります。 お手数ばかりかけて申し訳ないです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問