NoReverseMatch at /エラーが解決できない。

実現したいこと

Djangoのmodel.pyで定義したCustomUserテーブルの"userID"フィールドからデータを取り出し、テンプレートにレンダリングしたい

発生している問題・分からないこと

ユーザーの詳細画面を、CustomUserのuserIDを用いて表示させたい(例:userIDがhogehogeの場合、account/hogehogeのようにしたい)のだが、以下のようなエラーが発生してしまっている。

エラーメッセージ

error

1NoReverseMatch at / 2Reverse for 'user_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['accounts/user/(?P<userID>[^/]+)/$']

該当のソースコード

Django/models.py

1from django.contrib.auth.models import AbstractUser 2from django.db import models 3from django.core.exceptions import ValidationError 4from django.core.validators import RegexValidator 5 6class CustomUser(AbstractUser): 7 userID = models.CharField( 8 primary_key=True, 9 max_length=20, 10 unique=True, 11 blank=False, 12 validators=[RegexValidator(r'^[0-9a-zA-Z]+$', message='userIDは半角英数字のみ使用できます。')] 13 ) 14 password1 = models.CharField(max_length=15, blank=False, validators=[RegexValidator(r'^(?=.*[0-9])(?=.*[a-zA-Z]).{5,15}$', message='パスワードは半角英数字を各1文字以上含む5文字以上15文字以下で入力してください。')]) 15 password2 = models.CharField(max_length=15, blank=False, validators=[RegexValidator(r'^(?=.*[0-9])(?=.*[a-zA-Z]).{5,15}$', message='パスワードは半角英数字を各1文字以上含む5文字以上15文字以下で入力してください。')]) 16 question = models.CharField(max_length=20, blank=False) 17 answer = models.CharField(max_length=20, blank=False) 18 19 def clean_password(self): 20 if not self.password1 == self.password2: 21 raise ValidationError("パスワードが一致しません") 22 23 if CustomUser.objects.filter(userID=self.userID).exclude(pk=self.pk).exists(): 24 raise ValidationError("このユーザーIDはすでに別のユーザーによって使用されています。") 25

Django/views.py

1from django.urls import reverse_lazy 2from django.views import generic 3from .forms import CustomUserCreationForm 4from django.http import JsonResponse, HttpResponse, Http404 5from .models import CustomUser 6from django.views.decorators.http import require_GET 7from django.contrib.auth.decorators import login_required 8from django.shortcuts import render, get_object_or_404 9from django.contrib.auth import get_user_model 10import logging 11from .models import CustomUser 12 13logger = logging.getLogger(__name__) 14 15class SignUpView(generic.CreateView): 16 form_class = CustomUserCreationForm 17 success_url = reverse_lazy('login') 18 template_name = 'registration/signup.html' 19 20 def form_valid(self, form): 21 user_id = form.cleaned_data.get('userID') 22 logger.info(f"Received user ID: {user_id}") 23 return super().form_valid(form) 24 25def check_user_id(request): 26 user_id = request.GET.get('userID', None) 27 if user_id: 28 exists = CustomUser.objects.filter(userID=user_id).exists() 29 return JsonResponse({'exists': exists}) 30 return JsonResponse({'error': 'No userID provided'}, status=400) 31 32@login_required 33def user_detail(request): 34 userID= request.user.userID #リクエストしたユーザー(request.user)のuserIDを取得 35 user = get_object_or_404(CustomUser, userID=userID) #userIDを使ってユーザーを取得 36 return render(request, 'template/base.html', {'user': user}) #{'user': user} は、テンプレートに渡されるコンテキストで、user 変数には取得したユーザーオブジェクトが含まれる。 37

template/base.html

1<div class="sidebar-inner"> 2 <ul> 3 <div class="sidebar-contents"> 4 <li id="account"><a href="{% url 'user_detail' request.user.userID %}">アカウント</a></li>

試したこと・調べたこと

上記の詳細・結果

chatGPTに質問を投げた所、「userIDが空のままuser_detailビューに渡されてしまっている」という原因は提示してくれているが、同時に提示してもらった方法をいくら試しても同じエラーが表示されてしまっている。

補足

初心者コードで恐縮ですが、ご査収いただきたく投稿いたしました。
MySQLを使用していますが、userIDフィールドのデータはちゃんと登録されています。(サインアップ時に登録する)

コメントを投稿

0 コメント