Я работаю над проектом в 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 it goin? Logout Exception Type: TemplateSyntaxError at / Exception Value: Caught an exception while rendering: too many values to unpack
Любые идеи относительно того, что происходит или что я делаю неправильно?
Это исключение означает, что вы пытаетесь распаковать кортеж, но кортеж имеет слишком много значений в отношении количества целевых переменных. Например: эта работа и печатает 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
Теперь, почему это происходит в вашем случае, я не знаю, но, возможно, этот ответ укажет вам в правильном направлении.
obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';
хотя все значения являются строковыми, я получаю сообщение об ошибке, я запускаю его по приглашению python, но он принимает это исключение, принимая ответ из Интернета. Можете ли вы предложить, что происходит не так.
попробуйте распаковать в одну переменную,
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.models.modelname", а просто "appname.modelname" . Причина в том, что Django не использует это для прямого импорта; вместо этого он использует внутреннюю функцию загрузки модели, которая хочет только имя приложения и имя модели. Попытка сделать что-то вроде "appname.models.modelname" или "projectname.appname.models.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 по-прежнему имеет небольшую магию импорта, которая, как правило, вызывает путаницу, когда небольшая ошибка не генерирует ожидаемое исключение.
В конце трассировки, который я опубликовал, вы можете увидеть, как использование ничего, кроме формы "appname.modelname" для AUTH_PROFILE_MODULE, приведет к строке "app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')" для сброса ошибки "слишком много значений для распаковки".
Я на 99% уверен, что это была оригинальная проблема, встречающаяся здесь.
AUTH_PROFILE_MODULE
в вашем settings.py
?
Это происходит со мной, когда я использую Jinja2 для шаблонов. Проблема может быть решена путем запуска сервера разработки с помощью команды runserver_plus
из django_extensions.
Он использует werkzeug отладчик, который также оказывается намного лучше и имеет очень приятную интерактивную консоль отладки. Он использует некоторую магию ajax для запуска оболочки python в любом кадре (в стеке вызовов), чтобы вы могли отлаживать.
Скорее всего, есть ошибка где-то в вызове get_profile(). На ваш взгляд, прежде чем вы вернете объект запроса, поместите эту строку:
request.user.get_profile()
Он должен поднять ошибку и дать вам более подробную трассировку, которую затем можно использовать для дальнейшей отладки.