Django – 登录表单的定制化无法呈现。

我想能够自定义我的登录表单,但是当我的登录页面呈现时,登录表单并没有出现。我试着用自定义注册表的方式来做,但总是出现同样的问题。我很确定我的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.POSTelse: 条款?

希望能帮到你! 如果成功了,请告诉我。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

春天数据jpa与java FX

2022-5-11 14:00:16

解决方案

显示GDS中各列的简单平均数。

2022-5-11 14:00:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索