前提・実現したいこと
DjangoでWebページを作成している初学者です。
作成したプロジェクトをVPS上にデプロイしたところ、NoReverseMatchのエラーが発生します。
ローカル環境ではエラーが出ることなく正常に動作しており、何が問題なのかわからず困っています。
恐れ入りますが、何かご存じでしたらご教示いただきたいです。
発生している問題・エラーメッセージ
該当のソースコード
# layout.html {% load static %} {% load videos %} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>動画アップロード</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css"> <link rel="stylesheet" href="{% static 'videos/style.css' %}"> <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script> <link rel="stylesheet" href="{% static 'jquery-3.3.1.slim.min.js' %}"> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="./js/script.js"></script> </head> <body> <header> <nav class="navbar is-dark" role="navigation" aria-label="main navigation"> <div class="navbar-brand"> <h2 class="navbar-item">video_list</h2> <div class="buttons"> <ul class="nav_list"> <li><a href="{% url 'videos:video_list' %}" class="button is-dark">ホーム</a></li> {% if user.is_authenticated %} <li><a href="{% url 'videos:video_create' %}" class="button is-dark">動画投稿</a></li> <li><a href="{% url 'videos:video_ranking' %}" class="button is-dark">ランキング</a></li> <li><a href="{% url 'videos:search' %}" class="button is-dark">検索</a></li> <li><a href="{% url 'videos:user_detail' user.id %}" class="button is-dark">{{ user }}</a> </li> <li><a href="{% url 'logout' %}" class="button is-dark">Logout</a></li> {% else %} <li><a href="{% url 'login' %}" class="button dark">Login</a></li> <li><a href="{% url 'accounts:signup' %}" class="button dark">SignUp</a></li> {% endif %} </ul> </div> </div> </nav> <div class="nav-wrapper"><!-- ②ナビゲーションメニュー --> <nav class="header-nav"> <ul class="nav-list"> <li class="nav-item"><a href="{% url 'videos:video_list' %}">ホーム</a></li> {% if user.is_authenticated %} <li class="nav-item"><a href="{% url 'videos:video_create' %}">動画投稿</a></li> <li class="nav-item"><a href="{% url 'videos:video_ranking' %}">ランキング</a></li> <li class="nav-item"><a href="{% url 'videos:search' %}">検索</a></li> <li class="nav-item"><a href="{% url 'videos:user_detail' user.id %}">{{ user }}</a> </li> <li class="nav-item"><a href="{% url 'logout' %}">Logout</a></li> {% else %} <li class="nav-item"><a href="{% url 'login' %}">Login</a></li> <li class="nav-item"><a href="{% url 'accounts:signup' %}">SignUp</a></li> {% endif %} </ul> </nav> </div> <div class="burger-btn"><!-- ③ハンバーガーボタン --> <span class="bar bar_top"></span> <span class="bar bar_mid"></span> <span class="bar bar_bottom"></span> </div> </header> <div class="section"> <div class="container"> <div class="maierea"> <aside class="aside"> {% if user.is_authenticated %} {% create_search_form request %} {% create_category_list %} {% endif %} </aside> <main> <div class="main"> {% block content %} {% endblock %} </div> </main> </div> </div> </div> </body> </html> <script> $('.burger-btn').on('click',function(){ $('.burger-btn').toggleClass('close'); $('.nav-wrapper').fadeToggle(500); }); </script>
# urls.py from django.urls import path from . views import (VideoList, VideoCreate, VideoUpdate, VideoDelete, VideoDetail, CommentCreate, VideoCategoryList, CommentCreate, VideoCategoryList, UserDetail, Ranking, Search) from .views import goodfunc, badfunc app_name = 'videos' urlpatterns = [ path('', VideoList.as_view(), name='video_list'), path('create/', VideoCreate.as_view(), name='video_create'), path('update/<int:pk>', VideoUpdate.as_view(), name='video_update'), path('delete/<int:pk>', VideoDelete.as_view(), name='video_delete'), path('play/<int:pk>', VideoDetail.as_view(), name='video_detail'), path('comment/<int:pk>', CommentCreate.as_view(), name='comment_create'), path('category/<int:pk>', VideoCategoryList.as_view(), name='video_category_list'), path('user/<int:pk>', UserDetail.as_view(), name='user_detail'), path('video_ranking/', Ranking.as_view(), name='video_ranking'), path('search/', Search.as_view(), name='search'), path('good/<int:pk>',goodfunc, name='good'), path('bad/<int:pk>', badfunc, name='bad'), ]
# views.py from django.shortcuts import get_object_or_404, redirect, render from django.views import generic from django.views.generic.base import TemplateView from .models import Video, Comment,Category from django.urls import reverse_lazy from django.db.models import Q from .forms import CommentCreateForm, VideoSearchForm from django.contrib.auth.mixins import LoginRequiredMixin from django.core.exceptions import PermissionDenied from django.contrib.auth.models import User from django.views.generic import ListView ~~一部省略~~ class Ranking(LoginRequiredMixin, generic.ListView): model = Video template_name = 'videos/user_detail.html' paginate_by = 9 ordering = '-good' class Search(LoginRequiredMixin, generic.TemplateView): template_name = 'videos/search.html' def get_queryset(self): queryset = super().get_queryset() form = VideoSearchForm(self.request.GET or None) if form.is_valid(): key_word = form.cleaned_data.get('key_word') if key_word: queryset = queryset.filter(Q(title__icontains=key_word) | Q(title__icontains=key_word)) return queryset def goodfunc(request,pk): object = Video.objects.get(pk=pk) username = request.user.get_username() if object.good == None: object.good = 0 if object.goodtext == None: object.goodtext = 'a' if username in object.goodtext: return redirect('videos:video_detail', pk=pk) else: object.good = object.good + 1 object.goodtext = object.goodtext + ' ' + username object.save() return redirect('videos:video_detail', pk=pk) def badfunc(request,pk): object = Video.objects.get(pk=pk) username = request.user.get_username() if object.bad == None: object.bad = 0 if object.badtext == None: object.badtext = 'a' if username in object.badtext: return redirect('videos:video_detail', pk=pk) else: object.bad = object.bad + 1 object.badtext = object.badtext + ' ' + username object.save() return redirect('videos:video_detail', pk=pk)
# ranking.html {% extends 'layout.html' %} {% load static %} {% load videos %} {% block content %} <div class="video_list grid"> {% for video in video_list %} <div class="video"> <h1>{{ forloop.counter }}位</h1> <a href="{% url 'videos:video_detail' video.pk %}"> {% if video.thumbnail %} <img src="{{ video.thumbnail.url }}"> {% else %} <img src="{% static 'videos/noimage.png' %}"> {% endif %} <h2>{{ video.title }}</h2> </a> </div> {% endfor %} </div> <div class="num"> <!-- 前の部分 --> {% if page_obj.has_previous %} <a href="?{% url_replace request 'page' page_obj.previous_page_number %}">前へ</a> {% endif %} <!-- 数字の部分 --> {% for num in page_obj.paginator.page_range %} {% if page_obj.number == num %} <span>{{ num }}</span> {% else %} <a href="?{% url_replace request 'page' num %}">{{ num }}</a> {% endif %} {% endfor %} <!-- 次への部分 --> {% if page_obj.has_next %} <a href="?{% url_replace request 'page' page_obj.next_page_number %}">次へ</a> {% endif %} </div> <div class="back_btn"> <a href='JavaScript:history.back()' class="button is-light">戻る</a> </div> {% endblock %}
試したこと
ネット上で同じNoReverseMatchのエラーに関する内容のものを一通り試したのですが、いずれも解決には至りませんでした。
補足情報(FW/ツールのバージョンなど)
Python3
Django
PostgreSQL
Nginx
gunicorn
さくらVPS
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー