Создать страницу входа без использования Django формы входа по умолчанию - PullRequest
0 голосов
/ 23 января 2020

Я хотел бы знать, возможно ли создать собственную страницу входа (с нуля) без использования форм входа по умолчанию Django, потому что я хочу добавить другие поля?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вы можете написать свой собственный вид, но лучше просто создать подкласс Django LoginView и изменить столько, сколько вам нужно, например:

from django.http import HttpResponseRedirect
from django.contrib.auth.views import LoginView
from django.contrib.auth import login
from .forms import MyCustomLoginForm

class SignInView(LoginView):
    form_class = MyCustomLoginForm
    template_name = 'path/to/my_template.html'

    def form_valid(self, form):
        # Form is valid, do whatever you need.
        login(self.request, form.get_user())
        response = HttpResponseRedirect(self.get_success_url())
        return response

forms.py

from django import forms
from django.contrib.auth.forms import AuthenticationForm

class MyCustomLoginForm(AuthenticationForm):
    age = forms.IntegerField(label='Age', required=True)

    def clean_age(self):
        age = self.cleaned_data['age']
        # validate age
        return age

1 голос
/ 23 января 2020

в этой модели пользователя, я объявил поле имени пользователя как адрес электронной почты. Пользователь не может войти в систему, используя имя пользователя и пароль. Пользователь должен указать адрес электронной почты и пароль для входа в систему.

my models.py

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, active=True, is_staff=False, is_admin=False,is_superuser=False):
        if not email:
            raise ValueError("Users must have an email address")
        if not password:
            raise ValueError("Users must have password")
    user_obj = self.model(
            email=self.normalize_email(email)
        )
        user_obj.set_password(password)
        user_obj.staff = is_staff
        user_obj.admin = is_admin
        user_obj.active = active
        user_obj.superuser = is_superuser
        user_obj.save(using=self._db)
        return user_obj

    def create_superuser(self, email, password=None):
        user = self.create_user(
        email,
        password=password,
        is_superuser=True,
        is_staff=True,
        is_admin=True,
        )
        return user


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    staff = models.BooleanField(default=False)
    superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = []
    objects = UserManager()
    def _str_(self):
        return self.email

@property
def is_staff(self):
    return self.staff

@property
def is_superuser(self):
    return self.superuser

my views.py

from .models import User
class LoginAPIView(APIView):
    def post(self, request):
        serializer = LoginSerializers(data=request.data)
        if serializer.is_valid():
            data = serializer.data
            email = data['email']
            password = data['password']
            user = authenticate(email=email, password=password)
            if user is not None:
                login(request, user)
                token, created = Token.objects.get_or_create(user=user)
                return Response({"message": "success", "code": status.HTTP_201_CREATED, "details": serializer.data,
                             "Token": token.key})
            return Response(
                {"message": "error", "code": status.HTTP_401_UNAUTHORIZED, "details": ["Invalid credentials"]})

my serializers.py:

class LoginSerializers(serializers.Serializer):
    username = serializers.CharField(max_length=255)
    password = serializers.CharField(max_length=128)

может быть, это может помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...