0

enter image description hereI tried to implement customized user login/ Registration in django. but only one user can be logged in but not anyother user are logged in. Registration area looks fine cause user can register easily.

These are my codes I guess there is problem with CSRF token but i dont know where to update it In view 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})

My Views Login

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>

New User Model In NewUser model

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']
samita
  • 165
  • 1
  • 11

1 Answers1

2

In your loginPage view, you are calling authenticate as follows:

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

If you are using the default value in settings for AUTHENTICATION_BACKENDS, the standard authenticate function only accepts username and password as named arguments. By passing in email, it won't return a User.

If you need to login using email, you can write a custom authentication backend. This popular question has some answers that might help.

MattRowbum
  • 2,162
  • 1
  • 15
  • 20