Пользователь зарегистрирован, но не может войти в систему django

Я пытался реализовать настраиваемый вход/регистрацию пользователей в django. но только один пользователь может войти в систему, а другие пользователи не входят. Область регистрации выглядит нормально, потому что пользователь может легко зарегистрироваться.

Вот мои коды Я предполагаю, что есть проблема с CSRF токеном, но я не знаю, где его обновить В представлении Register

def registerPage(request):
    form = UserForm()
    if request.method == 'POST':
        print(request.POST)
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.user_name = user.user_name.lower()
            user.save()
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, 'An error occured duing registration!!')
    return render(request, 'base/login_register.html', {'form': form})

Мои взгляды Вход

def loginPage(request):
    page = "login"
    if request.user.is_authenticated:
        return redirect('home')
    if request.method == "POST":
        email = request.POST.get('email').lower()
        password = request.POST.get('password')

        try:
            user = NewUser.objects.get(email=email)
        except:
            messages.error(request, 'User doesnot exist')
        user = authenticate(request, email=email, password=password)
        if user is not None:
            login(request, user)
            print("mess going on here!")
            return redirect("home")
        else:
            messages.error(request, "Email or Password doesnot exit")
    context = {'page': page}
    return render(request, 'base/login_register.html', context)

Forms.py

from tkinter import Widget
from django.forms import ModelForm
from .models import NewUser

class UserForm(ModelForm):
    class Meta:
        model = NewUser
        fields=['email','user_name','first_name','country','address','year_in_school','about','avatar']

    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, **kwargs)
        self.fields['email'].widget.attrs.update({'class': 'form-control'})
        # self.fields['email','user_name','first_name','country','address','year_in_school','about'].widget.attrs.update({'class': 'form-control'})
        self.fields['user_name'].widget.attrs.update({'class': 'form-control'})
        self.fields['first_name'].widget.attrs.update({'class': 'form-control'})
        self.fields['country'].widget.attrs.update({'class': 'form-control'})
        self.fields['address'].widget.attrs.update({'class': 'form-control'})
        self.fields['year_in_school'].widget.attrs.update({'class': 'form-control'})
        self.fields['about'].widget.attrs.update({'class': 'form-control'})

        

Login/Register.html

<form
              method="POST"
              action=""
              class="form-contact"
              data-toggle="validator"
              novalidate="true"
            >
              {% csrf_token %}

              <div class="col-sm-6 col-md-6">
                <div class="form-group">
                  <input
                    type="text"
                    class="form-control"
                    id="p_name"
                    name="email"
                    placeholder="Enter Email"
                    required=""
                  />
                  <div class="help-block with-errors"></div>
                </div>
              </div>
              <div class="col-sm-6 col-md-6">
                <div class="form-group">
                  <input
                    type="password"
                    name="password"
                    class="form-control"
                    id="p_email"
                    placeholder="Enter Password"
                    required=""
                  />
                  <div class="help-block with-errors"></div>
                </div>
              </div>

              <div class="form-group">
                <div id="success"></div>
                <button type="submit" value="Submit" class="btn btn-primary">
                  Login
                </button>
              </div>
              <p>Haven't signed up yet?</p>
              <a href="{% url 'register' %}">Sign up</a>
            </form>

Модель нового пользователя В модели NewUser

class NewUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
    user_name = models.CharField(max_length=150, unique=True)
    first_name = models.CharField(max_length=150, blank=True)
    avatar = models.ImageField(null=True,default="avatar.svg")
    start_date = models.DateTimeField(default=timezone.now)
    address = models.CharField(max_length=150, default="Wuhan")
    country = models.CharField(max_length=150,)
    year_in_school = models.CharField(
        max_length=2,
        default=FRESHMAN,
    )

    about = models.TextField(_(
        'about'), max_length=500, blank=True)

    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    objects = CustomAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['user_name', 'first_name']

В вашем представлении loginPage вы вызываете authenticate следующим образом:

user = authenticate(request, email=email, password=password)

Если вы используете значение по умолчанию в настройках для AUTHENTICATION_BACKENDS, стандартная функция authenticate принимает в качестве именованных аргументов только username и password. Если передать email, она не вернет пользователя.

Если вам нужно войти в систему, используя электронную почту, вы можете написать пользовательский бэкенд аутентификации. На этот популярный вопрос есть ответы, которые могут помочь.

Вернуться на верх