用户登录和Django OTP

时间:2019-03-27 11:37:33

标签: python html django python-3.x one-time-password

我希望用户使用三个字段(仅用户名,密码和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设备”和“ Otp挑战”,因为它们对于我的情况是不必要的。

这是我的 models.py 文件

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'), ]

这是我使用的reference

1 个答案:

答案 0 :(得分:1)

解决方案1:

最直接的方法是使用OTPAuthenticationForm小部件将otp_device子类化为otp_challengeHiddenInput所用的表单字段。在您的应用文件夹中,创建一个名为forms.py的新python文件,并添加以下内容

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_deviceotp_challenge,因此可以将它们省略。对于要显示的每个字段,请使用{% bootstrap_field form.<field> %},而不要使用{% bootstrap_form form %}。有关自定义每个字段的呈现方式的所有选项,请参见here。每个字段的错误都可以用{{ form.errors.<field> }}显示,但您必须自己设置样式。

以您的情况

{% bootstrap_field form.username %}
{% bootstrap_field form.password %}
{% bootstrap_field form.otp_token %}