인프런 커뮤니티 질문&답변

최다니엘님의 프로필 이미지

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

프로필 수정 구현과 장고3에서 추가된 TextChoices 활용

NoReverseMatch at /accounts/signup/

작성

·

627

·

수정됨

0

안녕하세요 선생님 ㅠㅠ
연달아서 에러가 빵빵 터지네요

NoReverseMatch at /accounts/signup/

Reverse for 'pydenticon_image' with keyword arguments '{'data': ''}' not found. 1 pattern(s) tried: ['identicon/image/(?P<data>.+)/\\Z']

인데요.

문제가 되는 부분은

<img src="{% url 'pydenticon_image' data=user.username %}" style="width: 24px; height: 24px;">

이 부분으로 나옵니다.

Error during template rendering
In template /Users/daniel_choi/Desktop/total_projects/instagram_second/templates/layout.html, error at line 77

Reverse for 'pydenticon_image' with keyword arguments '{'data': ''}' not found. 1 pattern(s) tried: ['identicon/image/(?P<data>.+)/\\Z']

이게 에러 추가 메세지 이구요.

하지만 이것과 관련하여는 잘 작동하다가 그냥 아무것도 만진것없이 echo 쪽만 들락거리고 signup 시도했던 것 밖에 없는데, 되다가 갑자기 에러가 나니깐 당황스럽네요;
(물론 admin을 제외한 계정을 계속해서 삭제하고 시도하긴 했습니다.)

from django_pydenticon.views import image as pydenticon_image

urlpatterns = [
    path('identicon/image/<path:data>/', pydenticon_image, name = 'pydenticon_image')
]

이렇게 되어있구요.

accounts/forms.py

에서도 User모델 상속 받고, class Meta로

fields 중에서 username을 분명히 오버라이드 시킨것도 확인이 되는데, 왜 이런 에러가 발생하는지 모르겠습니다! ㅠㅠ

 


이거는 추가적으로 몇번 테스트를해보니깐

1.계정을 생성한다

2.SMTP에러가 뜬다.

3.admin페이지에 들어가서 방금 생성된 계정을 삭제한다.

4.다시 /accounts/signup페이지에 접속시도한다.

5.<img src="{% url 'pydenticon_image' data=user.username %}" style="width: 24px; height: 24px;">

관련된 reversematch에러가 뜬다.

6.admin페이지에서 admin계정으로 로그인을 하고 accounts/signup 페이지로 와야 비로소 이 reversematch 에러가 뜨지 않습니다.

 


#번외

번외 적으로는 분명 계정을 생성했고, admin 페이지에서도 2개의 추가계정이 확인되는데, Django administration

(어드민페이지 로그인창)을 통해서 로그인하려고 하면 비밀번호를 맞게 입력해도 로그인이 안됩니다;

스크린샷 2023-01-24 오전 11.38.03.png

답변 2

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

아래의 오류에서 정확히 오류 내용을 알려주고 있습니다.

Reverse for 'pydenticon_image' with keyword arguments '{'data': ''}' not found. 1 pattern(s) tried: ['identicon/image/(?P<data>.+)/\\Z']

URL Reverse 오류인 것이죠.

identicon/image/데이터/ 주소 패턴에서는 .+ 로서 마침표(.) 패턴의 문자열이 + (1회 이상) 반복되기를 희망하고 있습니다. 이 패턴에 맞는 data가 지정되어야 URL Reverse에 성공을 하는 거죠.

그런데, 지정된 data 인자는 {'data': ''} 에서도 확인하실 수 있듯이, 빈 문자열입니다. 그래서 URL Reverse에 실패했다는 오류입니다.

아래 코드의 user.username 값이 빈 문자열로서 URL Reverse 시에 참조되었다는 거죠.
{% url 'pydenticon_image' data=user.username %}

이 경우는 2가지 경우입니다.

  1. user.username의 값이 정말 빈 문자열인 경우

  2. 혹은 현재 템플릿 render 시에 지정된 context data에 user 인자가 없을 경우 : 장고 템플릿 엔진에서는 참조하고자 하는 context data가 없을 경우, 별도 오류를 발생시키지 않고, 디폴트로 빈 문자열로 참조합니다.

이 경우는 첫번째 경우입니다. 장고에서 로그인하지 않은 상황에서 request.user 는 AnonymousUser 클래스의 인스턴스이며, 로그인된 상황에서는 User 모델의 인스턴스입니다.

AnonymousUser 클래스에서는 username 필드는 빈 문자열입니다.
https://github.com/django/django/blob/4.1.5/django/contrib/auth/models.py#L420

그러니, 관리자로 로그인하셨을 때에는 위 오류가 발생하지 않으셨던 것 입니다.

해당 코드는 user.username 값을 필히 채워넣어주셔야 하구요. 로그인 상황일 때에만 호출되도록 하는 것도 한 가지 방법입니다.

{% if user.is_authenticated %}
{% url 'pydenticon_image' data=user.username %}
{% endif %}

URL Reverse 오류는 개발하시면서 많이 만나시는 오류 중 하나입니다.
이번 기회로 URL Reverse 오류를 인지하고 해결하는 방법을 차근차근 정리해보세요.

화이팅입니다. :-)

최다니엘님의 프로필 이미지
최다니엘
질문자

감사합니다! 이번 케이스에 대해서는 설명해 주신 덕분에 이해했고, 해결했습니다!!

0

최다니엘님의 프로필 이미지
최다니엘
질문자

앗 선생님 지금 에러처리를 하다보니깐 생각난건데요.
Django administration
관련해서
이미 생성된 계정을 admin외의 계정으로 Django administration

에서 로그인하려고 하면 비밀번호가 분명히 맞음에도 #번외와 같은 메세지가 뜹니다. 왜 그런걸까요?(혹시몰라서 계정을 삭제하고 시도하고, 삭제하고 시도하기를 SMTP 과정 반복하면서 10번가까지 시도했던것 같습니다!)

이진석님의 프로필 이미지
이진석
지식공유자

admin 페이지에서는 staff 권한이 있는 유저만 로그인할 수 있습니다.

staff 권한이 없는 유저는 비밀번호가 맞더라도 admin 페이지에는 로그인할 수 없습니다.

/admin/ 에 접근 시의 로그인 처리 모듈을 admin 앱의 로그인 모듈이기 때문이기에 그렇게 처리되고 있습니다.

최다니엘님의 프로필 이미지
최다니엘
질문자

오!! 감사합니다!!