Вход с формами не работает

Поэтому я делаю страницу входа с формами, проблема в том, что она не работает:D

это моя форма

forms.py

from django.contrib.auth.models import User
from django import forms

class UserForm(forms.ModelForm):

    password = forms.CharField(widget=forms.PasswordInput)
        class Meta:

    model = User
    fields = ['username', 'password',]

мои views.py

def user_login(request):

    if request.method == 'POST':
        login_form = UserForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data.get('username')
            raw_password = login_form.cleaned_data.get('password')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('restricted')
    else:
       login_form = UserForm()
return render(request, 'userlogin.html', {'login_form': login_form})

и мой HTML

<h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    {{ login_form.username }}
      <br>
      {{ login_form.password }}
      <br>
    <button type="submit">Login</button>
  </form>

ограниченным является HTML, который проверяет, какой пользователь вошел в систему. И он работает нормально. Я не уверен, почему он не работает, потому что он продолжает перенаправлять меня на страницу loginuser.html вместо перенаправления на страницу с ограниченным доступом, которая появляется только в том случае, если пользователь вошел в систему.

2 ответа

Решение

Добавить блок с ошибками формы в ваш шаблон

<h2>Login</h2>
  <form method="post">
<!-- form errors -->
{% if login_form.errors %}
    {% for field in login_form %}
        {% for error in field.errors %}
                <strong>{{ error|escape }}</strong>
        {% endfor %}
    {% endfor %}
    {% for error in login_form.non_field_errors %}
            <strong>{{ error|escape }}</strong>
    {% endfor %}
{% endif %}
<!-- form errors -->
    {% csrf_token %}
    {{ login_form.username }}
      <br>
      {{ login_form.password }}
      <br>
    <button type="submit">Login</button>
  </form>

Вам нужно добавить больше деталей, но вот пошаговое руководство для входа пользователей:

forms.py:

from django.contrib.auth import authenticate, get_user_model


User = get_user_model()

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField()

def clean(self, *args, **kwargs):
    username = self.cleaned_data.get("username")
    password = self.cleaned_data.get("password")
    user_obj = User.objects.filter(username=username).first()
    if not user_obj:
        raise forms.ValidationError("Invalid credentials")
    else:
        if not user_obj.check_password(password):
            raise forms.ValidationError("Invalid credentials")
    return super(LoginForm, self).clean(*args, **kwargs)

и в вашем views.py:

from django.contrib.auth import login
from .forms import LoginForm # or where you have the LoginForm

User = get_user_model()

def user_login(request):
    form = LoginForm(request.POST or None)
        if not request.user.is_authenticated:
            if form.is_valid():
                username_ = form.cleaned_data.get('username')
                user_obj = User.objects.get(username__iexact=username_)
                login(request, user_obj)
                return #something
            else:
                # show an error or etc
                ...
        else:
            # user is authenticated before and he is in.
            ...

и ваш template.html:

<form action="" method="post">
{% csrf_token %}
    <input type="text" name="username">
    <hr>
    <input type="password" name="password">
    <hr>
    <button type="submit">Login</button>
</form>

Примечание: вы можете использовать django для визуализации формы, но вам нужно внести некоторые изменения в поля формы, такие как пароль (добавление PasswordInput виджет)

Другие вопросы по тегам