1

我在我的Django项目中使用Django注册电子邮件。在那里的文件(Django-Registration-Email),我被指示添加REGISTRATION_EMAIL_REGISTER_SUCCESS_URLsettings.py。然而,这是造成错误类型:Django注册'str'对象不可调用

'str' object is not callable 

在settings.py,我设置了重定向URL这样:

REGISTRATION_EMAIL_REGISTER_SUCCESS_URL = '/accounts/register/complete/' 

而且该URL复制这样:

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 

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

+0

你可以发布完整的Traceback吗? – shaktimaan 2014-09-03 01:27:49

+0

它可能与此相关吗? http://stackoverflow.com/questions/10809240/typeerror-str-object-is-not-callable-django-python?rq=1 – faboolous 2014-09-03 01:41:35

+0

我已经添加了回溯以及重定向url的设置。 – 2014-09-03 02:48:07

回答

0

OK,当您在URL处理器使用

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

,要设置get_success_url为字符串。然后,您将其作为函数form_valid进行调用,尝试将其传递给变量。

+0

嗨GAEfan,谢谢你的回答。其实我从Django注册电子邮件的文档(链接:https://github.com/bitmazk/django-registration-email)复制这段代码。我认为他们正试图将重定向url传递给后端视图。你知道如何解决它吗?非常感谢,您的回答非常有帮助! – 2014-09-03 03:27:27

+0

你正在混合2个不同的包:django-registration和django-registration-email,他们的url处理程序是不同的。如果你把'REGISTRATION_EMAIL_REGISTER_SUCCESS_URL ='/ accounts/register/complete /'放在'settings.py'中,那么'get_success_url'将总是以字符串形式返回。你需要选择一个包或其他,并且只使用它。 – GAEfan 2014-09-03 03:54:37

+0

Django的注册电子邮件是基于Django的登记来包装,所以我需要包括在我的settings.py INSTALLED_APPS,通过文档的指示。你知道什么是“GETATTR(设置,‘REGISTRATION_EMAIL_REGISTER_SUCCESS_URL’,拉姆达的要求,用户:‘/’)”在做什么?为什么使用lambda?我如果你读Django中注册的电子邮件的'Important'部分种遗憾使用Django注册的电子邮件 – 2014-09-03 04:02:59

0

最后,我发现问题出在哪里:REGISTRATION_EMAIL_REGISTER_SUCCESS_URL期待的功能,而不是字符串

所以,我应该在settings.py添加一个行功能

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

无论如何,我仍然想搬到allauth,因为django-registration-email不再维护。

相关问题