Django - Настройка формы входа не отображается - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу иметь возможность настроить форму входа в систему, но когда моя страница входа отображается, форма входа не отображается.
Я пытался сделать это так, как настроил форму регистрации, но у меня всегда одна и та же проблема. .
Я почти уверен, что мои 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 %}

Но когда я go захожу на мой сайт, единственное, что появляется, это моя кнопка "вход" (Se connecter).

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Проблема была в моем views.py.
Я просто изменил переменную c_form на form.
Кроме того, как @georgekrax сказал мне, я добавил еще else и добавил здесь круглые скобки form = FormulaireConnexion().
Наконец, когда моя форма была обработана, у меня было несколько ошибок. Я забыл .get в username = c_form.cleaned_data.get('username') и забыл поставить username= и username= в user = authenticate(username=username, password=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.get('username')
            password = c_form.cleaned_data.get('password')
            user = authenticate(username=username, password=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})

После (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":
        form = FormulaireConnexion(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data('username')
            password = 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 !')
    else:
        form = FormulaireConnexion()
    return render(request,'authentification/connexion.html', {'form':form})

Я также изменил «c_form» на «form» в моем html файле:

{% extends "home/index.html" %}

{% block title %}
Se connecter
{% endblock %}

{% block content %}
<form method="post" class='formulaire'>
    {% csrf_token %}
    {% for field in 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 %}
0 голосов
/ 23 апреля 2020

Хотя 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:?

Надеюсь, это поможет! Пожалуйста, дайте мне знать, если это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...