前提・実現したいこと
Djangoで「https://<ホスト名>/mypage/<ユーザ名>」のようなアクセスでログイン中のマイページに行けるようにコードを書いていますが、下記のようにValueErrorが発生してしまいます。
DetailViewを継承したMyPageViewでルーティングに関するクラス変数をオーバーライドしても、デフォルトでルーティングに使われるpkが変数として利用されているままになってしまいます。
他のQ&Aや公式を参考にしても、硫黄量を得られず、エラーが改善されずにどうしたら良いものかと..
発生している問題・エラーメッセージ
ValueError at /mypage/ユーザ名/ Field 'id' expected a number but got 'ユーザ名'. Request Method: GET Request URL: http://localhost:8000/mypage/ユーザ名/ Django Version: 3.0.3 Exception Type: ValueError Exception Value: Field 'id' expected a number but got 'ユーザ名'.
該当のソースコード
models.py
models.py
1from django.db import models 2from django.contrib.auth.models import AbstractUser 3 4# Create your models here. 5class CustomUser(AbstractUser): 6 """拡張ユーザーモデル""" 7 8 class Meta: 9 verbose_name_plural = 'CustomUser'
views.py
from django.shortcuts import render from django.views import generic from accounts.models import CustomUser class MyPageView(generic.DetailView): template_name = 'mypage.html' model = CustomUser slug_field = 'username' #モデルのフィールド名 slug_url_kwarg = 'mypage' #urls.pyでのキーワード名 pk_url_kwarg = 'username' #ルーティングでの変数名の変更
urls.py
from django.urls import path from . import views app_name = 'article' urlpatterns = [ path('', views.IndexView.as_view(), name='index'), path('inquiry/', views.InquiryView.as_view(), name='inquiry'), path('mypage/<username>/', views.MyPageView.as_view(), name='mypage'), ]
mypage.htmlへのリンク先
<a class="dropdown-item" href="{% url 'article:mypage' user.username %}">Profile</a>
調べてみたこと
url.pyでのデフォルトのルーティングはpkとなっており、下記のDetailViewのクラス変数をオーバーライドするとルーティングにpk以外を使用できるようになる。
slug_field(モデルのフィールド名)
slug_url_kwarg(url.pyでのキーワード名)
pk_url_kwarg(urls.pyでの変数名)
補足情報(FW/ツールのバージョンなど)
- 認証機能にはdjango-allauthを使用しています。
- ユーザモデルにはAbstractUserクラスを継承したCustomUserモデルを使用しています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。