【问题标题】:Django AllAuth and Django Crispy FormsDjango AllAuth 和 Django Crispy 表单
【发布时间】:2020-08-04 23:37:36
【问题描述】:

我正在尝试覆盖默认的django-allauth 模板并使用改进的渲染中的django-crispy-forms,但没有运气让表单实际提交,这意味着我按下提交并没有任何反应。

这是我的settings.py

INSTALLED_APPS = [
    'about.apps.AboutConfig',
    'content.apps.ContentConfig',
    'users.apps.UsersConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
]

...

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# All Auth settings

AUTHENTICATION_BACKENDS = (
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',

)

SITE_ID = 1

ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'

这是我的自定义模板:

{% extends "about/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
{% block navbar %}{% endblock %}

<div class="site-section mb-5">
  <div class="container">
   <div class="form-register">
     <form method="POST" class="signup" id="signup_form" action="{% url 'account_signup' %}">
         {% csrf_token %}
             <legend>Signup</legend>
             <div class="form-group">
               {{ form | crispy }}
            </div>
            <div class="form-group">
              <input type="submit" class="btn btn-primary" value="Sign Up">
            </div>
     </form>
    </div>
  </div>
</div>
{% endblock %}

我知道模板位于正确的位置并正确覆盖django-allauth 默认模板,因为它会呈现,但为什么提交按钮不提交表单?我也知道django-allauth 的所有内容都可以正常工作,因为如果我删除自定义模板并使用django-allauth 模板,它将提交表单并正确重定向。

【问题讨论】:

    标签: python django django-models django-forms django-allauth


    【解决方案1】:

    我现在自己做这个。真的,我需要查看 {{ form|crispy }} 的数据才能确切知道发生了什么。

    但是,仅仅呈现一个类似的表单并提交是不够的。 allauth 有一些东西在后台运行(其中一些我并不完全了解)。 我建议从 allauth github 中提取模板并直接编辑它们,删除您知道肯定不需要的标签,例如“扩展 'allauth/base.html'、标题等。它们位于 Here .

    然后,我按照第二种方法from this answer 的详细信息将表单添加为上下文处理器(对我的案例使用最有用):

    2。上下文处理器

    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()}
    

    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
    

    处理器在这里 'django.template.context_processors.debug', # [...其他处理器...] ], }, }, ]

    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 %}
    

    因此,如果您要呈现自己的表单,我建议您在自定义模板中呈现完全相同的 allauth 表单。

    添加脆皮标签,一切都很好。

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 2020-03-25
      • 2012-04-16
      • 2014-05-31
      • 2017-07-08
      • 2019-07-19
      • 1970-01-01
      • 2014-02-03
      • 2018-02-19
      相关资源
      最近更新 更多