【问题标题】:Add custom field to Django Admin authentication form将自定义字段添加到 Django 管理员身份验证表单
【发布时间】:2020-09-01 10:05:45
【问题描述】:

我正在构建一个应用程序,其中身份验证过程具有三个字段。

  1. 子域
  2. 用户名
  3. 密码

每个子域定义一个独立的空间,用户名仅在其子域内是唯一的

例如:

  • 子域foo.bar.com 拥有用户jhon_doe,密码为secret。它可能存在另一个 jhon_doe 但在其他子域中。

所以...我创建了一个自定义后端身份验证,它运行良好。问题是登录 Django Admin 表单默认有usernamepassword 字段。

我想使用 subdomain usernamepassword 字段实现自定义 Django Admin 登录表单。

【问题讨论】:

    标签: django django-forms django-views django-admin


    【解决方案1】:

    我有类似的要求,我通过以下方式做到了。看看能不能帮到你。

    首先我扩展了我现有的用户模型,并在 models.py 中添加了电子邮件和电话。

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    
    class User(AbstractUser):
       email = models.EmailField(verbose_name='email',
                              max_length=255, unique=True)
       phone = models.CharField(null=True, max_length=255)
       REQUIRED_FIELDS = ['username', 'first_name', 'last_name']
       USERNAME_FIELD = 'email'
    
       def get_username(self):
           return self.email
    

    我创建了一个authapp,并在我在 authapp 文件夹中创建的form.py 中添加了以下几行。

    from django.views.generic import CreateView
    from django.forms import CharField,  ModelForm
    from django.utils.translation import gettext_lazy as _
    from authapp.models import User
    
    class LoginForm(ModelForm):
    class Meta:
        model = User
        fields = ('email', 'phone', 'password')
    

    最后我在模板中的 .html 文件中添加了这段代码。请求负载中的表单名称为 login_form

    <form method="POST" action="/login/">
        <div class="modal-body">{% csrf_token %} {{ login_form|crispy}}</div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">
            Close
          </button>
          <button type="submit" class="btn btn-primary">Login</button>
        </div>
      </form>
    

    我的登录表单的结果是

    我想在这里澄清一下,如果你想更改现有的登录屏幕,这是 Django 的默认设置,所以你必须搜索 arround,但在我的建议中,你应该实现你自己的自定义方式。

    谢谢你,编码愉快...

    【讨论】:

    • 你好。您能否在 forms.py 中提供 SignUp 类。我需要添加其他字段,但不知道该怎么做。谢谢
    • 你好,你在哪里注册 login_form ?
    • login_form 是上下文中 LoginForm() 的对象。 @纳西姆
    • @DmytroManzhula class RegisterForm(ModelForm): password = CharField(widget=PasswordInput()) class Meta: model = User fields = ('email', 'phone', 'password')
    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多