我已经通过Facebook,Twitter和Google配置了django-allauth登录。
但是,django-allauth仅在/accounts/login/
接受登录请求,仅在/accounts/signup/
等处注册请求。
我在我的主页上有一个用于登录和注册的模式表单,我只想使用它。
如何使用django-allauth系统允许从我的主页上的模态表单登录(社交和自定义)/注册等? 我正在寻找机制来覆盖django-allauth的网址并用我的网页/网址替换它们。
代码为here
模态表单HTML为here。
这个问题可能与this类似。然而,问题的答案是不可理解的。
经过几个答案,我做了这些改动:
#views.py
def logreg(request):
context = {
'login_form': MyLoginForm(),
'signup_form': MySignupForm()
}
return render(request, 'login.html', context)
#In URL Patterns of urls.py
url(r'^login/', logreg, name='login'),
In Index ( from where call to the modal is to be made):
<p>Welcome visitor <a href="#" data-modal-url="{% url 'login' %}">Login</a> or <a href="#">Register</a></p>
所有这些工作导致了这个混乱:
Internal Server Error: /login/
Traceback (most recent call last):
...
django.core.urlresolvers.NoReverseMatch: Reverse for 'ecomweb.home' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
During handling of the above exception, another exception occurred:
...
django.core.urlresolvers.NoReverseMatch: Reverse for 'home' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
我对发生的事情感到震惊。
答案 0 :(得分:4)
嗯,这很容易解决。
urls.py中的执行此操作:
from allauth.account.views import LoginView, SignupView
urlpatterns = [
...
url(r'^customurl/login/', LoginView.as_view(), name="custom_login" ),
url(r'^customurl/signup/', SignupView.as_view(), name="custom_singup" ),
...
]
并在html中创建表单:
<form action="{% url 'custom_signup' %}" method="POST">
{{ form.as_p }}
</form>
<form action="{% url 'custom_login' %}" method="POST">
{{ form.as_p }}
</form>
答案 1 :(得分:0)
要使用allauth的登录或注册功能,您不必覆盖与之关联的网址。
将提交表单提交到与allauth相关联的网址
<form action="/accounts/login/?next{{request.path}}" method="POST">
{% csrf_token %}
<!-- Your form elements here -->
</form>
<form action="/accounts/signup/?next{{request.path}}" method="POST">
{% csrf_token %}
<!-- Your form elements here -->
</form>
如果您希望用户与他登录的位置保持同一页面,则可以使用?next {{request.path}} 。
更新答案:
首先,不要将模板存储在静态文件夹中,这不是一个好习惯。
正如我已经指出的那样,为了使用allauth的views
功能,您不必覆盖其url
和views
(除非出于特定原因) )。
account
login.html
档案。将html登录code
粘贴到此login.html
文件中。
删除您的方法自定义登录方法logreg
及其相关内容
url
和imports
。
更改指向自定义登录方法的所有引用
logreg
account_login
(allauth的登录名)。
在您的base.html中 - 替换{%static&#39; login.html&#39; %}到{%url &#39; account_login&#39; %}。
你准备好了。
但是,当用户尝试访问/accounts/login/
页面时,您必须处理该案例的HTML。
此外,你总是可以使用thefallback方法通过ajax请求将你的模态登录表单提交到accounts / login /并处理success()和error()。
答案 2 :(得分:0)
我想你可能想在家庭视图中调用django-allauth的表格
在views.py
:
from django.allauth.account.forms import LoginForm, SignupForm
def home(request):
context = {
'login_form': LoginForm(),
'signup_form': SignupForm(),
}
return render(request, "myapp/home.html", context)
在您的主页模板中(例如templates/myapp/home.html
):
<form action="{% url 'account_login' %}?next={% url 'home' %}" method="POST">
{% csrf_token %}
{{login_form}}
</form>
<form action="{% url 'account_signup' %}?next={% url 'home' %}" method="POST">
{% csrf_token %}
{{login_form}}
</form>
然后最后一件事是默认情况下您将拥有Django-allauth的blank
模板,但您可以通过在名为base.html
的应用程序目录中创建account
模板来覆盖它们模板目录(例如myproject/templates/account/base.html
。我建议从您用于主页模板的同一模板扩展。
确保此account/base
模板具有以下块,该块将由django-allauth填写:
{% block content %}
{% endblock %}
以这种方式覆盖allauth的模板(如果您愿意,可能希望在每个端点上执行此操作)仅在您在 allauth
之前加载自己的应用时才有效settings.py
:
INSTALLED_APPS = [
'django.contrib.admin',
...
'myapp',
'allauth',
'allauth.account',
...
答案 3 :(得分:0)
当您尝试覆盖urls.py中的网址时,您是否将覆盖置于&#34; url的上方或下方(r&#39; ^ accounts /&#39;,include(&#39; allauth.urls& #39))&#34 ;?当我第一次尝试覆盖allauth时,我将我的代码放在该行的下方,这不起作用 - 超出该行的工作。