我想能够自定义我的登录表单,但是当我的登录页面呈现时,登录表单并没有出现。我试着用自定义注册表的方式来做,但总是出现同样的问题。我很确定我的settings.py和urls.py是正确的(”inscription “是我的身份验证的应用名称)。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'home.apps.HomeConfig',
'inscription.apps.InscriptionConfig',
]
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from inscription import views as i
from home import views as h
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('home.urls')),
path('accueil/', h.index, name='accueil'),
path('inscription/', i.inscription, name='inscription'),
path('connexion/', i.connexion, name='connexion'),
path('deconnexion/', i.deconnexion, name='deconnexion'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我基于现有的AuthenticationForm(forms.py)创建了我的登录表单。
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth import login, authenticate
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
class FormulaireConnexion(AuthenticationForm):
username = forms.CharField(
label = 'Nom de compte'
)
password = forms.CharField(
label = "Mot de passe",
strip = False,
widget = forms.PasswordInput(),
)
class Meta:
model = User
fields = ['username','password']
然后,我在views.py中使用了我的自定义表单。
from django.shortcuts import render, redirect
from .forms import FormulaireInscription, FormulaireConnexion
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
def connexion(request):
if request.method == "POST":
c_form = FormulaireConnexion(request, data=request.POST)
if c_form.is_valid():
username = c_form.cleaned_data('username')
password = c_form.cleaned_data('password')
user = authenticate(username, password)
if user is not None:
login(request, user)
return redirect('/home')
else:
messages.error(request, 'Nom de compte ou mot de passe invalide !')
else:
messages.error(request, 'Nom de compte ou mot de passe invalide !')
c_form = FormulaireConnexion
return render(request,'authentification/connexion.html', {'form':c_form})
最后,我在我的html文件中渲染了这个表单。
{% extends "home/index.html" %}
{% block title %}
Se connecter
{% endblock %}
{% block content %}
<form method="post" class='formulaire'>
{% csrf_token %}
{% for field in c_form %}
<p>
{{ field.label_tag }}<br>
{{ field }}
</p>
{% endfor %}
{% for message in messages %}
<p class="messages">{{message}}</p>
{% endfor %}
<button type="submit">Se connecter</button>
</form>
{% endblock %}
但是当我进入我的网站时,唯一出现的是我的 “登录”(Se connecter)按钮。
解决方案:
虽然 else:
可以省略,添加它是一个很好的做法。我可以看到,你传递了你的表单,但你没有初始化它。比如说,那就用它来固定。
def connexion(request):
if request.method == "POST":
c_form = FormulaireConnexion(request, data=request.POST)
if c_form.is_valid():
# ........
else:
messages.error(request, 'Nom de compte ou mot de passe invalide !')
else:
messages.error(request, 'Nom de compte ou mot de passe invalide !')
c_form = FormulaireConnexion()
return render(request,'authentification/connexion.html', {'form':c_form})
注意到那些括号了吗?
这将是一个很好的做法,像这样在视图中操作表单。
def connexion(request):
if request.method == "POST":
c_form = FormulaireConnexion(request.POST)
if c_form.is_valid():
# ........
else:
messages.error(request, 'Nom de compte ou mot de passe invalide !')
else:
messages.error(request, 'Nom de compte ou mot de passe invalide !')
else:
c_form = FormulaireConnexion()
return render(request,'authentification/connexion.html', {'form':c_form})
注意到了吗?request.POST
和 else:
条款?
希望能帮到你! 如果成功了,请告诉我。