使用自定义网址/页面覆盖Django-allauth登录/注册网址

时间:2016-06-30 14:32:41

标签: python django django-allauth

我已经通过Facebook,Twitter和Google配置了django-allauth登录。

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

enter image description here

如何使用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: []

我对发生的事情感到震惊。

4 个答案:

答案 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功能,您不必覆盖其urlviews(除非出于特定原因) )。

  1. 在您的模板文件夹中创建一个新文件夹account login.html档案。
  2. 将html登录code粘贴到此login.html文件中。

  3. 删除您的方法自定义登录方法logreg及其相关内容 urlimports

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

  5. 在您的base.html中 - 替换{%static&#39; login.html&#39; %}到{%url &#39; account_login&#39; %}。

  6. 你准备好了。

    但是,当用户尝试访问/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时,我将我的代码放在该行的下方,这不起作用 - 超出该行的工作。