Ошибка типа: %d формат: требуется номер, а не юникод
Я получаю сообщение об ошибке, подтверждающее, что у меня есть TYPEERROR
... мой тест базы данных работает нормально, когда я создаю экземпляр video
, поэтому я знаю, что это не проблема. Я исследовал здесь, здесь и в Интернете возможную проблему, но я не нашел ничего подходящего.
С момента создания веб-фреймворка при попытке создать видео с помощью HTML-формы теперь я получаю следующую трассировку:
File "/usr/local/lib/python2.7/site-packages/notssdb/model/base.py", line 122, in __repr__
return "<Video(videoname='%s', length='%d', url='%s')>" % (self.videoname, self.length, self.url)
TypeError: %d format: a number is required, not unicode
Это веб-код, который, по моему мнению, вызывает проблему: установка views:
def get_video(self):
video_id = int(self.request.matchdict['id'])
video = self.API.retrieve_video(video_id)
return {'videoname': video.videoname, 'length': video.length, 'url': video.url}
@view_config(request_method='POST')
def post_video(self):
videoname = self.request.params['videoname']
length = self.request.params['length']
url = self.request.params['url']
video = self.API.create_video(videoname, length, url)
return HTTPAccepted(location=request.route_url('/videos/{id}'))
HTML (шаблоны JINJA через платформу Pyramid):
<form method="POST" action="/videos">
<dl>
<dt><label for = 'videoname'> Video Name </label></dt>
<dd>{{ forms.input('videoname') }}</dd>
<dt><label for = 'length'> Duration </label></dt>
<dd>{{ forms.input('int(length)') }}</dd> # < --- works
<dt><label for = 'url'> Video URL </label></dt>
<dd>{{ forms.input('url') }}</dd>
<dd><input type="submit" name="submit" value="Submit" /></dd>
</dl>
</form>
Добавлено свойство int() выше (см. <dd>{{ forms.input('int(length)') }}</dd> # < --- works
), но теперь получаю этот TRACEBACK:
line 93, in post_video
length = self.request.params['length']
File "build/bdist.macosx-10.10-x86_64/egg/webob/multidict.py", line 342, in __getitem__
raise KeyError(key)
KeyError: 'length'
ВИДЕО МОДЕЛЬ --SQLALCHEMY:
class Video(Base):
__tablename__ = 'videos'
#code
length = Column(Integer)
url = Column(String(300))
def __init__(self, videoname, length, url):
self.videoname = videoname
self.length = length
self.url = url
def __repr__(self):
return "<Video(videoname='%s', length='%s', url='%s')>" % (self.videoname, self.length, self.url)
1 ответ
Решение вопроса в заголовке:
Вы указываете с помощью "% d", что ожидаете, что self.length будет числом, но на данном этапе это Unicode.
Преобразуйте self.length в число типа float(self.length), используйте "% s" вместо "% d", что довольно надежно, или используйте формат вместо % ( см. Почему).
>>> length = "23.12"
>>> "{}".format(length)
"23.12"