前提・実現したいこと
Djangoを使って画像を中心としたブログアプリのようなシステムを作っています。
ログイン中は自分以外のユーザーの詳細ページも正常に開くのですが、
ログインしていない状態で他のユーザーの詳細ページに飛ぼうとする
(例:http://localhost:8000/user/5/と検索バーに打つ、トップページからリンクをふむ)
と、以下のエラーメッセージが発生します。
色々試したり調べたりしたつもりなのですが全く検討がつかないので解決の手がかりを教えていただけると嬉しいです。よろしくお願いします。
発生している問題・エラーメッセージ
NoReverseMatch at /user/1/ Reverse for 'user_detail' with arguments '(None,)' not found. 1 pattern(s) tried: ['user\/(?P<pk>[0-9]+)\/$']
該当のソースコード
views.py のユーザー詳細画面のクラスです。
(ユーザーの記事(UploadFile)が一覧で見られるように書いたつもりです)
python:views.py
1class UserDetail(DetailView): 2 model = UserModel 3 4 template_name = 'cms/user_detail.html' 5 6 def get_context_data(self, **kwargs): 7 context = super().get_context_data(**kwargs) 8 context['HisFiles'] = UploadFile.objects.filter(author= self.kwargs['pk']).order_by('-created_at') 9 return context
urls.pyです。userに関するパスのみ抜粋しています。
python:urls.py
1urlpatterns = [ 2 3 path('user/<int:pk>/update/', views.UserUpdate.as_view(), name='user_update'), 4 path('user/<int:pk>/', views.UserDetail.as_view(), name='user_detail'), 5 path('user/', views.UserList.as_view(), name='user_list'), 6 path('user/<int:pk>/delete/', views.UserDelete.as_view(), name='user_delete'), 7]
models.pyからuserに関するところの抜粋です。
python:models.py
1class AbstractUser(AbstractBaseUser, PermissionsMixin): 2 3 username_validator = UnicodeUsernameValidator() 4 icon = models.ImageField(upload_to="image/icon/", blank=True, null=True) 5 subicon = ImageSpecField(source='icon', 6 format="JPEG", 7 processors=[ResizeToFill(100,100)], 8 options={'quality': 75} 9 ) 10 username = models.CharField( 11 _('username'), 12 max_length=150, 13 unique=True, 14 help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), 15 validators=[username_validator], 16 error_messages={ 17 'unique': _("A user with that username already exists."), 18 }, 19 ) 20 21 first_name = models.CharField(_('first name'), max_length=150, blank=True) 22 last_name = models.CharField(_('last name'), max_length=150, blank=True) 23 24 email = models.EmailField(_('email address'), unique=True) 25 26 is_staff = models.BooleanField( 27 _('staff status'), 28 default=False, 29 help_text=_('Designates whether the user can log into this admin site.'), 30 ) 31 is_active = models.BooleanField( 32 _('active'), 33 default=True, 34 help_text=_( 35 'Designates whether this user should be treated as active. ' 36 'Unselect this instead of deleting accounts.' 37 ), 38 ) 39 date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 40 twitter = models.CharField(_('Twitter'), max_length=50, blank=True) 41 objects = UserManager() 42 43 EMAIL_FIELD = 'email' 44 USERNAME_FIELD = 'username' 45 REQUIRED_FIELDS = ['email'] 46 47 class Meta: 48 verbose_name = _('user') 49 verbose_name_plural = _('users') 50 abstract = True 51 52 def __str__(self): 53 return self.username 54 55 def clean(self): 56 super().clean() 57 self.email = self.__class__.objects.normalize_email(self.email) 58 59 def email_user(self, subject, message, from_email=None, **kwargs): 60 """Send an email to this user.""" 61 send_mail(subject, message, from_email, [self.email], **kwargs) 62 63 64class User(AbstractUser): 65 class Meta(AbstractUser.Meta): 66 swappable = "AUTH_USER_MODEL"
ユーザー詳細画面のtemplateは何も書かなくても同じバグが発生した(ログイン中は正常に表示され、ログインしていない状態だとNoReversematchエラーになる)ため省略します。
試したこと
・templateに問題があるのかと思い全て消しても変わりませんでした。
・同じエラー文が出ているstackoverflowの記事を見つけたのですが、状況が違うためよくわかりませんでした。
・挙動を確認しているとログインしていない状態ではuserのpkが Noneになることがわかったので、それが関係しているのではないかと思ったのですが、ユーザー詳細画面のtemplateからrequest.userやuserに関する情報を削除しても変わらなかったのでわかりませんでした。
・ログアウト中でもユーザー詳細以外のページは正常に作動します。
・ユーザー詳細画面でログアウトするとトップページに戻ってきます。
補足情報(FW/ツールのバージョンなど)
python:3.6
Django:2.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/30 00:05
2020/05/30 00:23