我知道这个话题已经有几个问题,但我试图实现这些解决方案,但无法真正解决我的问题。
我说的是allauth的社交注册,特别是facebook。
渴望的行为:在facebook注册后,我希望用户转到我的网址“accounts:welcome”,但当他们只是登录时,我希望他们转到我的LOGIN_REDIRECT_URL(这是网站的主页)。 在这里和那里看后,这是我想出的代码(编写我的自定义适配器)
settings.py:
LOGIN_REDIRECT_URL = ("gamestream:home")
SOCIALACCOUNT_ADAPTER = "myproject.users.adapter.MySocialAccountAdapter"
adapter.py:
from django.conf import settings
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
class MySocialAccountAdapter(DefaultSocialAccountAdapter):
def save_user(self, request, sociallogin, form=None):
print('OK11OK')
super().save_user(request, sociallogin, form=form)
return redirect(reverse('accounts:welcome'))
def get_connect_redirect_url(self, request, socialaccount):
print('OK22OK')
assert is_authenticated(request.user)
url = reverse('accounts:welcome')
return url
请假设所有链接/设置都很好,例如当我通过facebook应用程序创建用户时,控制台会输出'OK11OK'。事实上,方法get_connect_redirect_url永远不会被触发,因为我从未在控制台上读过“OK22OK”。 用户已创建,我最终在主页上,这不是我想要的。
所以我认为在save_user方法之后会调用其他东西,因为我可以告诉我通过帐户:欢迎,但最终在主页上。 我可以告诉你,因为如果我在save_user方法中返回了一个不正确的url,我会收到一条特定于该行上该url的错误。
那么,这里有什么问题? 我想我可能会覆盖错误的方法,但我已经阅读了基础SocialAccountAdapter的所有代码,我看不到任何其他可能是正确的选择。
只是想提一下,因为我对普通帐户注册(非社交)有更多控制权,所以我已经实现了我想要的目标。 有什么想法吗?
非常感谢!
答案 0 :(得分:0)
我也遇到了同样的问题,我找到了两种方法:
方法一
Django 没有使用 DefaultSocialAccountAdapter 的重定向函数,你必须重写 DefaultAccountAdapter 的 get_signup_redirect_url 函数才能达到结果。
首先你需要改变settings.py中的默认适配器:
ACCOUNT_ADAPTER = 'users.adapter.MyAccountAdapter'
然后,只需使用您的网址覆盖 get_signup_redirect_url:
# project/users/adapter.py
from allauth.account.adapter import DefaultAccountAdapter
class MyAccountAdapter(DefaultAccountAdapter):
def get_signup_redirect_url(self, request):
return resolve_url('/your/url/')
方法二
这个比较简单
如果您查看 DefaultAccountAdapter 的源代码,它会说:
<块引用> 返回登录后要重定向到的默认 URL。 注意
明确传递的 URL(例如通过传递 next
GET 参数)优先于此处返回的值。
因此,您可以在登录模板中传递下一个参数以强制重定向。以下是使用 Google 社交登录的示例:
{% load socialaccount %}
{% providers_media_js %}
{# your html tags #}
<body>
<a href="{% provider_login_url "google" next=/success/url/ %}">SOCIAL LOGIN </a>
</body>
当然,您可以根据需要个性化下一个网址(我指的是 /success/url/)。您可以使用所需的 url 传递上下文变量并将其放在那里而不是硬编码的 url。