"Слишком много значений для распаковки" исключение
Я работаю над проектом, в Django, и я просто начал пытаться расширить модель User, чтобы сделать профили пользователей.
к сожалению, я столкнулся с проблемой: каждый раз, когда я пытаюсь сделать профиль пользователя внутри шаблона (user.get_template.lastIP, например), я получаю следующую ошибку:
Environment:
Request Method: GET
Request URL: http://localhost:8000/
Django Version: 1.1
Python Version: 2.6.1
Template error:
In template /path/to/base.tpl, error at line 19
Caught an exception while rendering: too many values to unpack
19 : Hello, {{user.username}} ({{ user.get_profile.rep}}). How's it goin? Logout
Exception Type: TemplateSyntaxError at /
Exception Value: Caught an exception while rendering: too many values to unpack
идеи о том, что происходит или что я делаю неправильно?
5 ответов:
это исключение означает, что вы пытаетесь распаковать кортеж, но Кортеж имеет слишком много значений по отношению к числу целевых переменных. Например: это работа, и печатает 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Теперь, причина, почему это происходит в вашем случае, я не знаю, но, возможно, этот ответ будет указывать вам в правильном направлении.
попробуйте распаковать в одну переменную,
Python будет обрабатывать его как список,
затем распакуйте из списка
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
эта проблема выглядела знакомой, поэтому я подумал, что посмотрю, смогу ли я воспроизвести из ограниченного количества информации.
быстрый поиск нашел запись в блоге Джеймса Беннетта здесь который упоминает, что при работе с UserProfile для расширения модели пользователя распространена ошибка в settings.py может вызвать Django, чтобы бросить эту ошибку.
чтобы процитировать запись в блоге:
значение параметра не является " appname.модели.modelname", это просто " имя приложения.modelname". Причина в том, что Django не использует это для прямого импорта; вместо этого он использует внутреннюю функцию загрузки модели, которая хочет только имя приложения и имя модели. Пытаясь делать такие вещи, как " appname.модели.modelname " или " projectname.имя приложения.модели.modelname "в настройке AUTH_PROFILE_MODULE приведет к тому, что Django взорвется с ужасной ошибкой "слишком много значений для распаковки", поэтому убедитесь, что вы поставили " appname.modelname", и ничего больше, в значение AUTH_PROFILE_MODULE.
Если бы 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 все еще есть немного магии импорта, которая имеет тенденцию вызывать путаницу, когда небольшая ошибка не вызывает ожидаемого исключения.
вы можете видеть в конце вывод, что я опубликовано, как использовать что-либо, кроме формы "имя приложения.modelname "для AUTH_PROFILE_MODULE вызовет строку" app_label, model_name = settings.AUTH_PROFILE_MODULE.расщеплять.'(') "чтобы выбросить ошибку" слишком много значений для распаковки".
я на 99% уверен, что это была первоначальная проблема, возникшая здесь.
скорее всего, где-то в вызове get_profile() есть ошибка. На ваш взгляд, прежде чем возвращать объект запроса, поместите эту строку:
request.user.get_profile()Он должен вызвать ошибку и дать вам более подробную трассировку, которую вы можете использовать для дальнейшей отладки.
Это произошло со мной, когда я использую Jinja2 шаблонов. Проблема может быть решена путем запуска сервера разработки с помощью
runserver_plusС django_extensions.использует werkzeug отладчик, который также оказывается намного лучше и имеет очень хорошую интерактивную консоль отладки. Он делает некоторую магию ajax, чтобы запустить оболочку python в любой рама (стек вызовов), так что вы можете отлаживать.
Comments