【问题标题】:TypeError: __str__ returned non-string (type PhoneNumber)TypeError: __str__ 返回非字符串(PhoneNumber 类型)
【发布时间】:2016-12-22 17:33:57
【问题描述】:

我在我的 django-rest-api 应用程序中使用 PhoneNumberField

class User(AbstractBaseUser, PermissionsMixin):
    phone_number = PhoneNumberField(_('phone number'), unique=True)

我成功创建了带有电话号码和密码的超级用户。但是每次运行服务器时我都会收到错误TypeError: __str__ returned non-string (type PhoneNumber) 有人可以帮助我

Stacktrace
TypeError: __str__ returned non-string (type PhoneNumber)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\core\handlers\exception.py", line 39, in inner
    response = get_response(request)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\utils\deprecation.py", line 136, in __call__
    response = self.get_response(request)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\core\handlers\exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\core\handlers\exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\views\debug.py", line 84, in technical_500_response
    html = reporter.get_traceback_html()
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\views\debug.py", line 317, in get_traceback_html
    return t.render(c)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 208, in render
    return self._render(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 199, in _render
    return self.nodelist.render(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 994, in render
    bit = node.render_annotated(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 961, in render_annotated
    return self.render(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\defaulttags.py", line 315, in render
    return nodelist.render(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 994, in render
    bit = node.render_annotated(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 961, in render_annotated
    return self.render(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\defaulttags.py", line 315, in render
    return nodelist.render(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 994, in render
    bit = node.render_annotated(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 961, in render_annotated
    return self.render(context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 1050, in render
    return render_value_in_context(output, context)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\template\base.py", line 1028, in render_value_in_context
    value = force_text(value)
  File "C:\Users\Emmanuel\Envs\myproject\lib\site-packages\django\utils\encoding.py", line 76, in force_text
    s = six.text_type(s)

【问题讨论】:

  • 你能提供回溯吗?错误消息甚至可能不是来自您的这部分代码,拥有回溯和它引用的任何代码都会很有帮助。
  • 对不起,我用 stacktrace@ShadowRanger 编辑了问题
  • 您的模型中有__str__ 方法吗?如果有,你能提供吗?
  • 你我的英雄!我没有声明它,但它是用return self.phone_number 明确调用的,这导致了我的问题。将其更改为return str(self.phone_number) 有效!谢谢@EvansMurithi
  • 人们对我的问题投了反对票。至少告诉我它有什么问题!

标签: python django django-rest-framework


【解决方案1】:

来自django-phonenumber-field 它说:

返回的对象是 PhoneNumber 实例,而不是字符串。

你应该这样做:

def __str__(self):
    return str(self.phone_number)

【讨论】:

  • 这应该是模型中的donde
  • 确实如此。请看this comment我提出的问题
【解决方案2】:

django-phonenumber-field 对象是 的一个实例,因此您需要转换为类型字符串以便 django 呈现它。

有几种方法可以做到这一点,这里是其中一种。

str 方法添加到您的模型中:

def __str__(self):
    return f"{self.phone_number}"

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多