如何将singup\signin模板移动到下拉菜单中?

Tit*_*ter 0 django django-templates django-allauth

我有一个固定的导航,我想添加下拉框,用户可以在其中单挑\(如Twitter使用).

我试过了:

# project/tempates/signup.html
{% load i18n %}
{% load account socialaccount %}

{% block head_title %}{% trans "Signup" %}{% endblock %}

{% block content %}

  <h1>{% trans "Sign Up" %}</h1>

  <p>{% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}</p>

  <form class="signup" id="signup_form" method="post" action="{% url 'account_signup' %}">
    {% csrf_token %}
    {{ signupform.as_p }}
    {% if redirect_field_value %}
    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
    {% endif %}
    <button type="submit">{% trans "Sign Up" %} &raquo;</button>
  </form>

{% endblock %}

# project/tempates/base.html
# ... a lot of basic stuff
<li class="dropdown">
    <a class="dropdown-toggle" href="#" data-toggle="dropdown">Sign In <strong class="caret"></strong></a>
    <div class="dropdown-menu" style="padding: 15px; padding-bottom: 0px;">
        {% include './signup.html' %}
# ... rest stuff
Run Code Online (Sandbox Code Playgroud)

在下拉框中,我只看到文本,登录链接以及确认注册的按钮.

没有字段可以输入电子邮件和密码.据我了解,这是因为无法访问表单,通常是视图的工作.我怎样才能获得可行的下拉表格?

Tit*_*ter 6

经过2天的互联网挖掘,我想总结一下我发现的东西.

有几种方法:

1.使用<form action='some address here'>.最简单的方法.

要检查默认AllAuth表单,我们需要:

# ./manage.py shell
>>> import allauth.account.forms as forms
>>> f = forms.LoginForm()
>>> print(f)
Run Code Online (Sandbox Code Playgroud)

以下是已编辑的版本,print(f)直接添加到base.html

<form action="{% url 'account_login' %}" method="post">
    {% csrf_token %}
    <input type="hidden" name="next" value="{{ request.get_full_path }}" />

    <input id="id_login" name="login" placeholder="Username or e-mail" type="text" required />
    <input id="id_password" name="password" placeholder="Password" type="password" required />

    <label for="id_remember">Remember Me:</label>
    <input id="id_remember" name="remember" type="checkbox" />

    <button type="submit">Login</button>
    <a href="{% url 'account_reset_password' %}">Forgot Password?</a>
</form>
Run Code Online (Sandbox Code Playgroud)

方法是基于 - > 这里的解决方案< -

2. Contex处理器

a)制作文件夹your_project/your_app/context_processor.放2个文件 - __init__.pylogin_ctx.py

B)login_ctx.py添加:

from allauth.account.forms import LoginForm

def login_ctx_tag(request):
    return {'loginctx': LoginForm()}
Run Code Online (Sandbox Code Playgroud)

c)在项目中SETTINGS添加your_app.context_processors.login_ctx.login_form_ctx' inTEMPLATES`部分.就像是:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'allauth')],
        'APP_DIRS': True,
        'OPTIONS': {
            'debug': DEBUG,
            'context_processors': [
                'your_app.context_processors.login_ctx.login_form_ctx',  # <- put your processor here 
                'django.template.context_processors.debug',
                # [...other processors...]
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

d)*.html你需要的地方添加下一个:

{% if not user.is_authenticated %}
    <form action="{% url 'account_login' %}" method="post">
        {% csrf_token %}
        <input type="hidden" name="next" value="{{ request.get_full_path }}" />
        {{ loginctx }}
        <button type="submit">Login</button>
    </form>
{% else %}
    {# display something else here... (username?) #}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

3.模板标签

a)制作文件夹your_project/your_app/templatetags.放2个文件 - __init__.pylogin_tag.py

B)login_tag.py添加:

from django import template
from allauth.account.forms import LoginForm

register = template.Library()

@register.inclusion_tag('profiles/true_login.html')
def login_form_tag(current_page=None):
    return {'loginform': LoginForm(),
            'redirect_to': current_page}
Run Code Online (Sandbox Code Playgroud)

c)在包含内容的your_project/your_app/templates/your_app/make文件中login_form.html:

{% load account  %}

{% if not user.is_authenticated %}
    <form action="{% url 'account_login' %}" method="post">
        {% csrf_token %}
        <input type="hidden" name="next" value="{{ redirect_to }}" />
        {{ loginform }}
        <button type="submit">Login</button>
    </form>
{% else %}
    {# display something else here... (username?) #}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

d)*.html您需要的任何地方,添加顶部{% load login_tag %}和所需的地方添加{% login_form_tag request.get_full_path %}


第二种和第三种方法显示原生AllAuth形式.如果你需要以某种方式编辑它,使用{{form}}- > here < - 在文档中你可以找到一些例子如何做到这一点.想要提一下,如果在文档中显示的内容如下:

<div class="fieldWrapper">
    {{ form.subject.errors }}
    {{ form.subject.label_tag }}
    {{ form.subject }}
</div>
Run Code Online (Sandbox Code Playgroud)

对于我们的情况form必须改为loginctxloginform

您也可以编写自己的表单或继承AllAuth并将其导入context processortemplatetag如上所示.

这两种方法都基于 - > 此解决方案 < -

在所有3种方法中,重定向根据需要工作(如果成功登录,则将用户返回到上一页,否则重定向到原始AllAuth模板site.com/account/login).

以上所有内容都可以实现到SignUP.

另外我问了一些人,如果错误的用户名\密码而不是重定向到如何显示错误site.com/account/login,一个命题是使用AJAX,但目前这是我所知道的.可以找到有关连接signin\up表单到默认AllAuth视图的一些基本信息 - > 此处 < - .如果有人可以实现它,或找到任何教程,请在此处发布.