前提・実現したいこと
現在django2を使用してwebアプリケーションを開発しております。
そのアプリには会員登録機能とログイン機能が備わっております。
そしてログインしたユーザーのみが詳細ページ内の「いいね」を押せる様に制限をかけたいです。
仕様としては
誰でも閲覧可能な詳細ページにアクセスし、
そこで現在ログインしているユーザーであれば通常通り「いいね」を押せる。
ログインしていないユーザーはログインページにリダイレクトされる。
発生している問題・エラーメッセージ
ログインしていないユーザーが「いいね」を押すと、無反応です。
「いいね」数もカウントされないし(これは問題無し)、リダイレクトもされない状態です。
該当のソースコード
django
1#views.py 2"""ライブラリ読み込み""" 3from django.shortcuts import render 4 5 6class DetailView(generic.DetailView): 7 """詳細ページはクラスビューで表示""" 8 model = User 9 template_name = 'register/detail.html' 10 11 12def like(request, pk): 13 """いいね機能""" 14 try: 15 user = User.objects.get(pk=pk) 16 except User.DoesNotExist: 17 raise Http404 18 user.like += 1 19 user.save() 20 return redirect('register:detail', pk=pk) 21 22 23def api_like(request, pk): 24 """いいね後ページをロードさせない""" 25 if not request.user.is_authenticated: 26 return render(request, 'register/login.html') #ログインページにリダイレクトさせる 27 try: 28 user = User.objects.get(pk=pk) 29 except User.DoesNotExist: 30 raise Http404 31 user.like += 1 32 33 return JsonResponse({"like":user.like})
django
1#urls.py 2 3urlpatterns = [ 4 path('', views.TopView.as_view(), name='top'), 5 path('<int:pk>/', views.DetailView.as_view(), name='detail'), #詳細ページのパス 6 path("<int:pk>/like/", views.like, name="like"), 7 path("api/like/<int:pk>/", views.api_like, name="api_like"), 8]
django
1#models.py 2 3class User(AbstractBaseUser, PermissionsMixin): 4 """カスタムユーザーモデル.""" 5 6 email = models.EmailField(_('email address'), unique=True) 7 first_name = models.CharField(_('first name'), max_length=30, blank=True) 8 last_name = models.CharField(_('last name'), max_length=150, blank=True) 9 like = models.IntegerField(default=0) 10 """省略."""
django
1#settings.py 2LOGIN_URL = 'register:login' 3LOGIN_REDIRECT_URL = 'register:top'
django
1#detail.html 2"""詳細ページ内のいいねボタン部分""" 3<div class="Likes"> 4<a onclick="api_like()" class="Likes-Icon"></a> 5</div> 6<script> 7 function api_like() { 8 var api_url = "{% url 'register:api_like' user.pk %}"; 9 var btn_txt = document.getElementById("like"); 10 var request = new XMLHttpRequest(); 11 request.onreadystatechange = function () { 12 if (request.readyState === 4 && request.status === 200) { 13 var received_data = JSON.parse(request.responseText); 14 btn_txt.innerText = received_data.like; 15 } 16 } 17 request.open("GET",api_url); 18 request.send(); 19 } 20</script>
試したこと
djangoのドキュメントを参考に試してみましたが同じ結果となりました。
django
1from django.contrib.auth.decorators import login_required 2 3@login_required 4def api_like(request, pk): 5 ... 6や 7 8from django.contrib.auth.decorators import login_required 9 10@login_required(login_url='/accounts/login/') 11def api_like(request, pk): 12 ...
補足情報(FW/ツールのバージョンなど)
処理のログをよく観てみるとこちらが表示されております。このリンクのせいで正しいリダイレクト先が呼び出せないのでしょうか?
django
1[23/Oct/2020 19:21:19] "GET /login/?next=/api/like/12/ HTTP/1.1" 200 6225 2
下記が参考にしたものです。
django公式ドキュメント
いいね機能はこちらのサイトにあるコードカスタマイズしました。
会員登録機能はこちらを参考にしました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/23 10:10
2020/10/26 00:39
2020/10/26 09:13