@scxxx

Почему не работает обработчик во views?

Внес в БД информацию о паре пользователей через ORM, хотел сделать самое простое, чтобы пользователь мог быть авторизован.

Создал модель на основе AbstractUser, ничего в нее не добавляя нового и сделал миграцию. Все было успешно.
#models.py

class CustomUser(AbstractUser):
    pass
    # add additional fields in here


Создал форму
#forms.py

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, UserChangeForm
from django.forms import forms
from .models import CustomUser

class UserLoginForm(AuthenticationForm):

    class Meta:
        model = CustomUser
        fields = ('username', 'password')

Прописал все возможные руты на будущее
#urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.login, name='login'),
    path('registration/', views.registration, name='registration'),
    path('profile/', views.profile, name='profile'),
    path('logout/', views.logout, name='logout'),
]


Сделал обработчик по шаблону просто потрогать
#views.py

from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render, redirect
from .forms import UserLoginForm
from django.contrib import auth

def login(request):
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            username = request.POST['username']
            password = request.POST['password']
            user = auth.authenticate(username,password)
            if user:
                if user.is_active:
                    auth.login(request, user)
                    print('Я вошел')
                    return redirect('homepage')
                else:
                    return HttpResponse('Аккаунт неактивен')
            else:
                HttpResponse('Такого пользователя нет!')
        else:
            HttpResponse("Невалидная форма")
    else:
        form = UserLoginForm()

    context = {'form': form}
    return render(request, 'users/registration/login.html', context)

И html представление
#login.html
{%extends 'base.html'%}

{%block content%}
  <div class="center">
	  <form method="post" class="card" action=".">
	  	{% csrf_token %}
	    <h2 class="text-center">Log in to your account</h2>
		{% for field in form %}
	    		{{ field.label_tag }}
	        	{{ field }}
	        	{% if field.errors %}
	        		<small>{{ field.errors|striptags }}</small>
	        	{% endif %}
		{% endfor %}

		<input type="submit" value="Login" class="btn btn-primary full-width">
		<hr>
		<p class="text-center">Forgot your password <a href="#">Reset Password</a></p>
		<p class="text-center">Don't have a account? <a href="#">Join Now</a></p>
	</form>
</div>


В результате отправки формы меня не редиретит на главную страницу, а данные не поступают в обработчик, трогал все возможные варинты
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ответы на вопрос 1
RyanovskY
@RyanovskY
у меня такая же ситуация, проблема в том что ты создал форму, без формы всё работет но не показывает ошибки.

если откатиться назад, на версию до создания формы, то всё будет воркать с такой вьюхой:

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('some_redirect_url')
    return render(request, 'login.html')


я хотел добавить обработку ошибок, для регистрации и для входа.

для регистрации всё получилось за секунду, буд-то 10 раз так делал(первый раз на самом деле)
def special_characters_validator(username):
    validator = RegexValidator(
        regex=r'^(?!_)[A-Za-z0-9_]+(?<!_)$'
    )
    try:
        validator(username)
    except ValidationError:
        if username.startswith('_'):
            return "Имя пользователя не может начинаться с подчеркивания."
        elif username.endswith('_'):
            return "Имя пользователя не может заканчиваться подчеркиванием."
        else:
            return ("Имя пользователя не может содержать пробелы или специальные символы.\n"
                    r"""^[-!#$%&'*+-/=?^`{}|~"[]()\.]$""")
    return None


common_passwords = [
    'password', 'qwerty', 'abc123',
    'password1', 'iloveyou', '1q2w3e4r',
    'qwerty123', 'zaq12wsx', 'dragon',
    'sunshine', 'princess', 'letmein',
    'monkey', '1qaz2wsx', 'qwertyuiop',
    'superman', 'asdfghjkl',
]


class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(label='Email', max_length=254)

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

    def clean_username(self):
        username = self.cleaned_data['username']

        # Проверка, что имя пользователя не содержит специальные символы
        validator_error = special_characters_validator(username)
        if validator_error:
            raise ValidationError(f"{validator_error}")

        # Проверка, что имя пользователя состоит только из английских букв
        if not all(char.isascii() and char.isalnum() or char == '_' for char in username):
            raise ValidationError("Имя пользователя может содержать только английские символы и подчёркивание.")

        # Проверка на длину юзернейма
        if len(username) < 6:
            raise ValidationError("Имя пользователя должно содержать не менее 6 символов.")

        # Проверка на уникальность имени пользователя
        if User.objects.filter(username__iexact=username).exists():
            raise ValidationError("Это имя пользователя уже занято.")
        elif ForbiddenUsername.objects.filter(username__iexact=username).exists():
            raise ValidationError("Это имя пользователя уже занято.")

        return username

    def clean_email(self):
        email = self.cleaned_data['email']
        if User.objects.filter(email__iexact=email).exists():
            raise ValidationError("Этот адрес электронной почты уже используется.")
        return email

    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')

        # Проверка, что пароль состоит только из английских символов
        if not all(char.isascii() and (char.isalnum() or char in r'''^[-!#$%&'*+-/=?^`{}|~"[]()\.]$''') for char in
                   password1):
            raise ValidationError(
                r'''Пароль может содержать только английские буквы,
                 цифры и специальные символы: ^[-!#$%&'*+-/=?^`{}|~"[]()\.]$''')

        # Проверка на длину пароля
        if len(password1) < 8:
            raise ValidationError("Пароль должен содержать не менее 8 символов.")

        # Проверка, что пароль не состоит только из цифр
        if password1.isdigit():
            raise ValidationError("Пароль не может состоять только из цифр.")

        # Проверка, что пароля нет в списке простых
        if password1.lower() in common_passwords:
            raise ValidationError("Пароль слишком простой.")

        return password1


а вот с логином пи**ец, не работает перенапрвление или при переходе на /login бесконечный цикл перенаправления на страницу логина получался.

я тоже ЖЕЛЯЮЩИЙ разобраться в этой проблеме.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы