[英]Django AllAuth and Django Crispy Forms
我正在尝试覆盖默认的django-allauth
模板并使用改进的渲染中django-crispy-forms
,但没有运气让 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
模板,它将提交表单并正确重定向。
我现在自己在做这个。 真的,我需要查看 {{ form|crispy }} 的数据才能确切知道发生了什么。
然而,仅仅渲染一个类似的表单并提交是不够的。 allauth 有一些东西在后台运行(其中一些我并不完全了解)。 我建议从 allauth github 中提取模板并直接编辑它们,删除您知道肯定不需要的标签,例如“扩展 'allauth/base.html'、标题等。它们可以在这里找到。
然后,我按照此答案中第二种方法的详细信息将 forms 添加为上下文处理器(对我的案例使用最有用):
2.上下文处理器
a)创建文件夹
your_project/your_app/context_processor
。 放 2 个文件 -__init__.py
和login_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' in
。 就像是: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 %}
因此,如果您要渲染自己的 forms,我建议您在自定义模板中渲染完全相同的 allauth forms。
添加香脆标签,一切都很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.