Ошибка типа: %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"
Другие вопросы по тегам