Django переопределяет процесс входа в систему django.contrib.auth

views.py

from django.contrib import messages
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from django.contrib.auth.views import LoginView
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

def templates(request):
    return render(request, 'templates.html')

def information(request):
    return render(request, 'information.html')

def custom_login(request):
    if request.POST:
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username = username, password = password)
            print("work")
            if user is not None:
                messages.success(request, 'Success')
                login(request, user)
                return HttpResponse('login')
                #logout(request)
            else:  
                messages.error(request, 'Invalid username or password')
                print("error")
                return HttpResponse('wrong username or password')

class CustomLoginView(LoginView):
    print("check")
    def form_valid(self):
        
        custom_login(self.request)     


urls.py

from django.contrib import admin
from django.urls import path, include
from ArtisticCode import views 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/login/', views.CustomLoginView.as_view(), name='login'), 
    path('accounts/', include('django.contrib.auth.urls')),
    path('', views.index, name = 'index'),
    path('templates/', views.templates, name = 'templates'),
    path('information/', views.information, name = 'information'),
]

accounts/login.html

<form method="post" class="login">
  {% csrf_token %}
  <div class="login_input">
    <img src="{% static 'img/bx_img1.png' %}" alt="image"/>
    <input type="text" placeholder="Username" name="username" required/>
  </div>
  <div class="login_input">
    <img src="{% static 'img/bx_img1.png' %}" alt="image"/>
    <input type="password" placeholder="Password" name="password" required/>
  </div>
  <input type="submit" value="Send message"/>
  {% if messages %}
    {% for message in messages %}
      <strong style="color:white;">{{ message }}</strong>
    {% endfor %}
  {% endif %}
  </form>

Идея состоит в том, чтобы выводить сообщение в случае неправильного пароля, но я не могу правильно поймать метод post. Из того, что я делал последние несколько дней, чтобы попытаться сделать это, я обнаружил, что мне нужно переопределить логин. Я думаю, что функция form_valid - это та, которую мне нужно переопределить, чтобы я мог обрабатывать метод post

setting.py

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.messages',
]
MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]

Решение проблемы - сделать все самому, не используя готовые функции, потому что пароль и имя идут в одно и то же место, независимо от того, пишешь ты его сам или используешь готовый код. Идея с самого начала была в том, что если использовать готовые формы типа form.as _p я не могу смеяться над стилем, то не было возможности поставить уведомление о неправильном пароле, отсюда я пришел к выводу, что лучше всего писать все самому.

изменения: urls.py

from django.contrib import admin
from django.urls import path
from ArtisticCode import views 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/login/', views.login, name='login'), 
    path('', views.index, name = 'index'),
    path('templates/', views.templates, name = 'templates'),
    path('information/', views.information, name = 'information'),
]

views.py

from django.contrib import messages
from django.contrib.auth import authenticate, login
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

def templates(request):
    return render(request, 'templates.html')

def information(request):
    return render(request, 'information.html')

def login(request):
    if request.POST:
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username = username, password = password)
        if user is not None:
            messages.success(request, 'Success')
            #login ...
        else:  
            messages.error(request, 'Invalid username or password')
    return render(request, 'registration/login.html')
Вернуться на верх