Как я могу аутентифицировать любого пользователя для входа в систему с помощью дополнительного поля (кроме имени пользователя/ электронной почты и пароля) в django

#python #django #django-authentication

Вопрос:

Я создаю профиль пользователя, используя систему аутентификации django (из django.contrib.auth.модели импортируют пользователя). Перед этим я пытаюсь расширить поле пользователя, используя дополнительное поле (т. е. профиль пользователя= генеральный директор/разработчик/руководитель отдела маркетинга) в models.py. Вот мой models.py файл

 from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class extendeduser(models.Model):
    userprofile_choice=(
        ('ceo', 'ceo'),
        ('developer', 'developer'),
        ('marketinghead', 'marketinghead'),
    )
    userprofile=models.CharField(choices= userprofile_choice, max_length=255, blank=False)
    user=models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self) -> str:
        return self.userprofile
 

теперь я успешно регистрирую нового пользователя. Теперь я создал различные html-страницы на основе их профиля. Поэтому во время входа в систему я беру дополнительный ввод от пользователя, который является профилем пользователя. И на основе этого я создал views.py для перенаправления пользователя в нужное место. Вот мой views.py файл :-

 def login(request):
if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    uf = request.POST['userprofile']

    user = auth.authenticate(username=username, password=password)
    user_profile = extendeduser.objects.filter(user = user)

    # print(user_profile[0])
    # print(uf)
    # print(user.get_username)
    # print(user.__dict__)
    #print(user.get_userprofile)

    if user is not None:
        if uf==user_profile[0]:
            if uf=='ceo':
                auth.login(request, user)
                messages.success(request, "You are logged-In")
                return redirect('wtoday')
            elif uf=='developer':
                auth.login(request, user)
                messages.success(request, "You are logged-In")
                return redirect('swhome')
            elif uf=='marketinghead':
                auth.login(request, user)
                messages.success(request, "You are logged-In")
                return redirect('sswhome')
            else:
                messages.warning(request, 'Invalid Credentials!!')
                return redirect('login')
        else:
            messages.warning(request, 'Invalid Credentials!')
            return redirect('login')
    else:
        messages.warning(request, 'Invalid Credentials')
        return redirect('login')
return render(request, 'accounts/login.html')
 

Все в порядке, но эта строка кода «if uf==user_profile[0]:» не работает. в основном это проверка того, что поле «userprofile» любого конкретного пользователя, которое хранится в базе данных, такое же, как во время входа в систему, или нет. Я говорю, что эта строка кода не работает, потому что, когда я комментирую эту строку, а затем, не проверяя профиль пользователя из базы данных, я просто перенаправляю их на основе данных, которые он вводит во время входа в систему, тогда это работает. Но я этого не хотел.

Пожалуйста, помогите мне выбраться!!

Ответ №1:

Вы не можете сравнивать uf и userprofile[0] , потому uf что это строка и userprofile[0] extendeduser объект. Может if uf == str(userprofile[0]): быть, это то, чего ты хочешь.

Комментарии:

1. да, именно то, чего я хотел.. Это работает идеально. Большое вам спасибо @Allen Shaw.