Логин пользователя и Django OTP - PullRequest
0 голосов
/ 27 марта 2019

Я хочу, чтобы пользователь вошел в систему, используя три поля: имя пользователя, пароль и ТОЛЬКО OTP.

Вот мой .html файл

{% extends "base.html" %}
{% load static %}
{% load bootstrap4 %}
{% block head %}
    <title>HomePage</title>
{% endblock %}
{% block content %}
    <div class="container">
        <div style='width:500px;margin:0 auto;' class="panel panel-default">
            <div class="panel-body">
                <h1>Login</h1>
                <form method="POST" class="form">
                    {% csrf_token %}
                    {% bootstrap_form form %}
                    {% buttons %}
                        <button type="submit" class="btn btn-primary">Login</button>
                    {% endbuttons %}
                </form>
            </div>
        </div>
    </div>
{% endblock %}

Вот браузер просмотр .html файла

enter image description here

Я хочу удалить Otp Device и Otp Challenge, так как они не нужны для моего случая.

Вот мой models.py file

from django.contrib.auth.models import AbstractUser


class ProjectUser(AbstractUser):
    # add additional fields in here

    def __str__(self):
        return self.email

Вот мой urls.py файл

from django_otp.forms import OTPAuthenticationForm
from django.contrib.auth.views import LoginView

urlpatterns = [

    path('user_login/', LoginView.as_view(template_name="accounts_app/user_login.html",
                                         authentication_form=OTPAuthenticationForm), name='user_login'), ]

Вот ссылка Я использовал

1 Ответ

1 голос
/ 27 марта 2019

Решение 1:

Прямой путь - использовать подкласс OTPAuthenticationForm для замены полей формы, используемых для otp_device и otp_challenge, с помощью виджета HiddenInput.В папке вашего приложения создайте новый файл Python с именем forms.py и добавьте следующий

from django_otp.forms import OTPAuthenticationForm
from django import forms

class SimpleOTPAuthenticationForm(OTPAuthenticationForm):
    otp_device = forms.CharField(required=False, widget=forms.HiddenInput)
    otp_challenge = forms.CharField(required=False, widget=forms.HiddenInput)

. В своем файле urls.py внутри приложения добавьте import и замените LoginView наследующий

from .forms import SimpleOTPAuthenticationForm

path('user_login/', LoginView.as_view(template_name="accounts_app/user_login.html",
                                      authentication_form=SimpleOTPAuthenticationForm), name='user_login'),

Решение 2:

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

Отображать только те поля, которые вы хотите в своем шаблоне: поскольку otp_device и otp_challenge не обязательны, вы можете просто пропустить их.Используйте {% bootstrap_field form.<field> %} для каждого поля, которое вы хотите отобразить вместо {% bootstrap_form form %}.Смотрите здесь для всех опций для настройки рендеринга каждого поля.Ошибки для каждого поля могут отображаться с помощью {{ form.errors.<field> }}, но вы должны сами их стилизовать.

В вашем случае

{% bootstrap_field form.username %}
{% bootstrap_field form.password %}
{% bootstrap_field form.otp_token %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...