🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2691閲覧

Djangoでログイン中のユーザ名をurlに設定してマイページに飛びたい

Mr_PONPON_MARU

総合スコア35

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/11/30 14:35

編集2020/12/01 09:29

前提・実現したいこと

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モデルを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

models.pyを下記のように書き直したら解決できました。
slug_url_kwargの値をusernameにして、pk_url_kwargの行を削除したら無事動くようになりました

class MyPageView(generic.DetailView): template_name = 'mypage.html' model = CustomUser slug_field = 'username' #モデルのフィールド名 slug_url_kwarg = '**username**' #urls.pyでのキーワード名(**nameの引数では無い!**)

投稿2020/12/01 09:42

Mr_PONPON_MARU

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

<a class="dropdown-item" href="{% url 'article:mypage' user.get_username %}">Profile</a>

ここを

<a class="dropdown-item" href="{% url 'article:mypage' user.username %}">Profile</a>

これでどうでしょうか?

投稿2020/11/30 15:50

gpjenkmug2

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mr_PONPON_MARU

2020/11/30 15:54

コメントありがとうございます。 ご指摘の通り訂正してみましたが、記載のエラーと同じエラーになってしまいました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問