[python] “포장을 풀기에 너무 많은 값”예외

저는 Django에서 프로젝트를 진행 중이며 사용자 프로필을 만들기 위해 사용자 모델을 확장하기 시작했습니다.

불행히도 문제가 발생했습니다. 템플릿 ( user.get_template.lastIP예 :)에서 사용자 프로필을 가져 오려고 할 때마다 다음 오류가 발생합니다.

환경:

요청 방법 : GET
요청 URL : http : // localhost : 8000 /
Django 버전 : 1.1
Python 버전 : 2.6.1

템플릿 오류 :
템플릿 /path/to/base.tpl에서 19 행 오류
   렌더링 중 예외 발생 : 압축을 풀기에 너무 많은 값

19 : 안녕하세요, {{user.username}} ({{user.get_profile.rep}}). 어떻게 지내요? 로그 아웃


예외 유형 : TemplateSyntaxError at /
예외 값 : 렌더링하는 동안 예외 발생 : 압축을 풀기에 너무 많은 값

무슨 일이 일어나고 있는지 또는 내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?



답변

이 예외는 튜플을 풀려고하지만 튜플에 대상 변수의 수에 비해 너무 많은 값이 있음을 의미합니다. 예 :이 작품은 1, 2, 3을 인쇄합니다.

def returnATupleWithThreeValues():
    return (1,2,3)
a,b,c = returnATupleWithThreeValues()
print a
print b
print c

그러나 이것은 당신의 오류를 발생시킵니다.

def returnATupleWithThreeValues():
    return (1,2,3)
a,b = returnATupleWithThreeValues()
print a
print b

인상

Traceback (most recent call last):
  File "c.py", line 3, in ?
    a,b = returnATupleWithThreeValues()
ValueError: too many values to unpack

자, 이것이 귀하의 경우에 발생하는 이유는 모르겠지만이 답변이 올바른 방향을 가리킬 것입니다.


답변

하나의 변수에서 압축을 풀고

파이썬은 그것을 목록으로 처리합니다.

그런 다음 목록에서 압축을 풉니 다.

def returnATupleWithThreeValues():
    return (1,2,3)
a = returnATupleWithThreeValues() # a is a list (1,2,3)
print a[0] # list[0] = 1
print a[1] # list[1] = 2
print a[2] # list[2] = 3


답변

이 문제는 익숙해 보였기 때문에 제한된 양의 정보에서 복제 할 수 있는지 확인할 수있을 것이라고 생각했습니다.

빠른 검색 제임스 베넷의 블로그에 항목을 설정 여기서 사용자 모델을 확장하기 위해 사용자 프로필 작업을 할 때 settings.py에서 일반적인 실수는 장고가이 오류를 발생시킬 수 있음을 언급한다.

블로그 항목을 인용하려면 :

설정 값은 “appname.models.modelname”이 아니라 “appname.modelname”입니다. 그 이유는 Django가 이것을 사용하여 직접 가져 오기를 수행하지 않기 때문입니다. 대신 앱 이름과 모델 이름 만 원하는 내부 모델 로딩 기능을 사용하고 있습니다. AUTH_PROFILE_MODULE 설정에서 “appname.models.modelname”또는 “projectname.appname.models.modelname”과 같은 작업을 시도하면 Django가 무서운 “압축을 풀기에 너무 많은 값”오류와 함께 폭발 할 수 있습니다. AUTH_PROFILE_MODULE의 값에는 “appname.modelname”만 입력합니다.

OP가 더 많은 트레이스 백을 복사 한 경우 AUTH_PROFILE_MODULE 설정에 “모델”을 추가하여 복제 할 수있는 다음과 같은 내용을 볼 수있을 것으로 예상합니다.

TemplateSyntaxError at /

Caught an exception while rendering: too many values to unpack

Original Traceback (most recent call last):
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 87, in render
    output = force_unicode(self.filter_expression.resolve(context))
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 535, in resolve
    obj = self.var.resolve(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 676, in resolve
    value = self._resolve_lookup(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 711, in _resolve_lookup
    current = current()
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/contrib/auth/models.py", line 291, in get_profile
    app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
ValueError: too many values to unpack

이것은 Django가 작은 오류가 예상되는 예외를 던지지 않을 때 혼란을 일으키는 경향이있는 약간의 가져 오기 마법을 가지고있는 몇 안되는 경우 중 하나라고 생각합니다.

AUTH_PROFILE_MODULE에 대해 “appname.modelname”형식이 아닌 다른 것을 사용하면 “app_label, model_name = settings.AUTH_PROFILE_MODULE.split ( ‘.’)”줄이 어떻게 “압축을 풀기에 너무 많은 값”오류.

저는 이것이 여기서 발생한 원래 문제라고 99 % 확신합니다.


답변

get_profile () 호출 어딘가에 오류가있을 가능성이 높습니다. 보기에서 요청 객체를 반환하기 전에 다음 줄을 입력하십시오.

request.user.get_profile()

오류가 발생하고 더 자세한 트레이스 백을 제공하여 추가 디버깅에 사용할 수 있습니다.


답변

템플릿에 Jinja2를 사용할 때 이런 일이 발생합니다. django_extensionsrunserver_plus 명령을 사용하여 개발 서버를 실행하면 문제를 해결할 수 있습니다 .

werkzeug 디버거를 사용합니다 .이 디버거는 훨씬 더 좋으며 매우 멋진 대화 형 디버깅 콘솔을 가지고 있습니다. 디버그 할 수 있도록 모든 프레임 (호출 스택에서)에서 Python 셸을 시작하는 ajax 마법을 사용합니다 .


답변