質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Django

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

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

Q&A

解決済

1回答

1246閲覧

Djangoでログアウトしている時のみNoReverseMatchのエラー

kinoru

総合スコア1

Django

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

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

0グッド

1クリップ

投稿2020/05/29 15:31

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

多分ですが、マイページに移動するaタグがあって、
(templateに渡している値がよくわからないので想像で書きますが)例としては、

HTML

1<a href="{% url 'user' login_user.id %}">マイページ</a> 2```みたいなのがあって、ログイン中は正常に動きますが、ログアウトすると```login_user.id```がNoneになるわけです。 3```path('user/<int:pk>/', views.UserDetail.as_view(), name='user_detail'),```より、int型しか受け入れていないので、Noneを渡すとエラーが出ます。 4これは一応推測です。 5ちなみにNoReversematchエラーは、URLのエラーなので, 6マッチしないURL(もとから無いURLではなく数字じゃなくて文字列をとったみたいな)時にでます。 7 8ログイン中の人のidを取って他ページに移動するところはありませんか?

投稿2020/05/29 21:35

ForestSeo

総合スコア2722

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

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

kinoru

2020/05/30 00:05

おっしゃる通りリンクよよく調べたところ、base.htmlにログイン中のuserのpk を取ったところがあり、ユーザー詳細画面のみそれを囲っている{% if user.is_authenticated %}が無効になっていました。本当にありがとうございました。
ForestSeo

2020/05/30 00:23

よかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問