用自定义的URL/页面覆盖Django-allauth登录/注册URL

9

我已经配置了django-allauth,可以通过Facebook、Twitter和Google进行登录。

但是,django-allauth只接受在/accounts/login/处的登录请求,在/accounts/signup/处的注册请求等。我在我的主页上有一个模态表单用于登录和注册,我想仅使用该表单。

enter image description here

我如何使用django-allauth系统允许从我的主页上的模态表单中进行登录(包括社交登录和自定义登录)/注册等操作?我正在寻找一种机制来覆盖django-allauth的URL并将它们替换为我的页面/ URL。

代码在此处

模态表单HTML位于此处

这个问题与这个问题可能相似。然而,问题中的答案并不太容易理解。

根据一些答案,我进行了以下更改:

#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: []

我对正在发生的事情感到疯狂困惑。


你解决了吗?我遇到了同样的问题。 - user3667089
@user3667089 有解决方案了吗?我也遇到了类似的问题... - Jayesh
@Jayesh,没有,解决了记得告诉我。 - user3667089
@user3667089 你试过使用 http://api.jquery.com/load/ 吗? - Jayesh
@user3667089 我成功地在模态弹出窗口中加载了all-auth登录页面。但问题是它会完全加载,包括base.html。 - Jayesh
显示剩余2条评论
4个回答

10
嗯,这是一个非常简单的解决方案。
在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>


模态表单没有URL。它是在访问者点击“登录”时触发的。在这种情况下该怎么办? - FlyingAura
为什么不将模态表单制作成<iframe src="{% url 'custom_login' %}"></iframe>的形式? - raphv
@raphv: 这会破坏页面的外观(https://postimg.org/image/m14gqfinl/) 根据你的建议,我用<iframe src="{% url 'login' %}">Login</iframe>替换了<p>Welcome visitor <a href="#" data-modal-url="{% static 'modals/login.html' %}">Login</a> or <a href="#">Register</a></p>. - FlyingAura
@raphv:我也在login.html模态框中添加了iframe。这不是我想要处理表单的方式。有其他选择吗? https://postimg.org/image/j4drf4y69/ - FlyingAura

3

要使用allauth的登录或注册功能,您无需覆盖与其相关联的URL。

只需将表单提交到与allauth关联的URL即可,例如

<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功能,您不一定需要覆盖它的urlviews(除非有特殊原因)。

  1. 在您的templates文件夹中创建一个名为account的新文件夹,并在其中加入一个名为login.html的文件。
  2. 将您的html登录代码粘贴到这个login.html文件中。

  3. 删除您的自定义登录方法logreg以及与之相关的urlimports

  4. 将所有指向您自定义登录方法logreg的引用更改为account_login(allauth的登录名称)。

  5. 在您的base.html中 - 将{% static'login.html'%}替换为{% url 'account_login'%}。

然后你就可以开始工作了。

但您需要处理当用户尝试访问/accounts/login/页面时的html。

此外,您始终可以使用回退方法通过ajax请求提交您的模态登录表单到accounts/login/并处理success()和error()。


你好,即使认证失败,我也希望它仍然停留在同一页。 - Lite

1
我认为您可能希望在主页视图中调用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模板,但是您可以通过在名为account的目录中创建base.html模板来覆盖它们,该目录位于您的应用程序模板目录中(例如:myproject/templates/account/base.html)。我建议从您用于主页模板的相同模板进行扩展。 确保此account/base模板具有以下块,这些块将由django-allauth填充:
{% block content %}
{% endblock %}

这种方式覆盖allauth的模板(如果您希望按端点分别执行此操作)只有在您在settings.py中先加载自己的应用程序之后再加载allauth时才能生效:
INSTALLED_APPS = [
    'django.contrib.admin',
    ...
    'myapp',
    'allauth',
    'allauth.account',
    ...

问题在于我想要在一个模态框中显示登录表单(模态框没有URL,而是一个不同的HTML文件。正如图像所示,它叠加在主页上)。 那么,在没有url.py条目的情况下,我如何将视图呈现到模态框中呢? - FlyingAura
通过在视图和模板中调用表单,就像我答案的第一部分那样。 - raphv
但是如果没有URL,我该怎么从模板中调用它呢!<p>欢迎访问者 <a href="#" data-modal-url="<what-to-put-here">登录</a> </p> - FlyingAura
你可以创建一个登录视图并将其与URL相关联,或者将其作为主页视图的一部分,如我的答案所示,默认情况下隐藏它,并在人们单击登录时显示它,例如使用<a href="#" onclick="document.getElementById('loginform').style.display='block';return false;">Login</a> - raphv
我尝试了你建议的后半部分(将其作为主页的一部分,使其默认隐藏,并在人们单击登录时显示),但这并不能使它成为模态窗口。https://postimg.org/image/ucvo1jg0n/ - FlyingAura
如果您将其放置在页面上的正确位置并使用正确的CSS样式,则可以将其设置为模态。 如果您查看基本的Bootstrap模态示例,就是这样做的http://getbootstrap.com/javascript/#modals - raphv

0

当尝试在urls.py中覆盖url时,您是将覆盖放在"url(r'^accounts/', include('allauth.urls'))"上方还是下方?第一次尝试覆盖allauth时,我将代码放在该行下面,但不起作用--将其放在上面就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接