Django 注册“str”对象不可调用

Posted

技术标签:

【中文标题】Django 注册“str”对象不可调用【英文标题】:Django Registration 'str' object is not callable 【发布时间】:2014-10-27 09:29:13 【问题描述】:

我在我的 Django 项目中使用 Django-registration-email。在文档 (Django-Registration-Email) 中,我被指示在 settings.py 中添加 REGISTRATION_EMAIL_REGISTER_SUCCESS_URL。但是,这会导致类型错误:

'str' object is not callable

在 settings.py 中,我将重定向 url 设置为:

REGISTRATION_EMAIL_REGISTER_SUCCESS_URL = '/accounts/register/complete/'

并且网址是这样复制的:

url(
    r'^accounts/register/$',
    RegistrationView.as_view(
        template_name='registration/registration_form.html',
        form_class=CustomEmailRegistrationForm,
        get_success_url=getattr(
            settings,'REGISTRATION_EMAIL_REGISTER_SUCCESS_URL',
            lambda request, user:'/'),
    ),
    name='registration_register',
),

并且调试信息告诉我第一个错误来自/local/lib/python2.7/site-packages/registration/views.py in form_valid

指示的错误行是

success_url = self.get_success_url(request, new_user)

整个区块是

def form_valid(self, request, form):
    new_user = self.register(request, **form.cleaned_data)
    success_url = self.get_success_url(request, new_user)

    # success_url may be a simple string, or a tuple providing the
    # full argument set for redirect(). Attempting to unpack it
    # tells us which one it is.
    try:
        to, args, kwargs = success_url
        return redirect(to, *args, **kwargs)
    except ValueError:
        return redirect(success_url)

回溯是:

Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/registration/views.py" in dispatch
  79.         return super(RegistrationView, self).dispatch(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/registration/views.py" in post
  35.             return self.form_valid(request, form)
File "/Library/Python/2.7/site-packages/registration/views.py" in form_valid
  83.         success_url = self.get_success_url(request, new_user)

Exception Type: TypeError at /accounts/register/
Exception Value: 'str' object is not callable

谁能帮我解决这个问题?非常感谢!我被这个问题困扰了一整天!

【问题讨论】:

你能发布完整的 Traceback 吗? 会不会和这个有关? ***.com/questions/10809240/… 我已经添加了traceback以及redirect url的设置。 嗨 Faboolous,谢谢。我看过这篇文章,我认为这是网址的问题。你知道怎么解决吗? 【参考方案1】:

好的,当你使用时

get_success_url=getattr(
        settings,'REGISTRATION_EMAIL_REGISTER_SUCCESS_URL',
        lambda request, user:'/'),
)

在您的 url 处理程序中,您将 get_success_url 设置为字符串。然后你在form_valid 中调用它,作为一个函数,试图传递变量。

【讨论】:

您好,GAEfan,感谢您的回答。实际上,我从 Django-registration-email 的文档中复制了这段代码(链接:github.com/bitmazk/django-registration-email)。我认为他们正在尝试将重定向 url 传递给后端视图。你知道如何解决吗?非常感谢,您的回答很有帮助! 您正在混合 2 个不同的包:django-registration 和 django-registration-email,它们的 url 处理程序不同。如果您将REGISTRATION_EMAIL_REGISTER_SUCCESS_URL = '/accounts/register/complete/' 放入您的settings.py,那么get_success_url 将始终将其作为字符串返回。您需要选择一个包或另一个包,并专门使用它。 django-registration-email 是一个基于 django-registration 的包,因此我需要按照文档的说明将这两个包都包含在 settings.py 中的 installed_apps 中。你知道“getattr(settings,'REGISTRATION_EMAIL_REGISTER_SUCCESS_URL',lambda request, user:'/')”在做什么吗?为什么使用 lambda?我有点后悔使用 django-registration-email 如果您阅读 django-registration-email 中的Important 部分,他们会告诉您:“由于放弃 django-registration,此应用已停产。还有很多市场上开发完善且更广泛的替代品。您为什么不查看 django-allauth:github.com/pennersr/django-allauth 嗨,GAEfan。谢谢你的帮助!你是对的,我应该搬到 django-allauth。谢谢。【参考方案2】:

最后,我发现问题出在哪里:REGISTRATION_EMAIL_REGISTER_SUCCESS_URL 需要一个函数而不是字符串

所以,我应该在settings.py中添加一行函数

REGISTRATION_EMAIL_REGISTER_SUCCESS_URL = lambda request, user: '/activate/complete/'

无论如何,由于 django-registration-email 不再维护,我仍然想迁移到 allauth。

【讨论】:

以上是关于Django 注册“str”对象不可调用的主要内容,如果未能解决你的问题,请参考以下文章

Django 预览,TypeError:'str' 对象不可调用

删除外键对象时,Django'str'对象不可调用

Django ElasticSearch Celery 任务模型调用返回“str”对象不可调用

在 django 中创建表单时对象不可调用错误

TypeError:'str' 对象在 main.py 的第 200 行不可调用

django:TypeError:'tuple'对象不可调用