微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改 Django Rest Framework 和 Django allauth 中的注册表单?

如何解决如何更改 Django Rest Framework 和 Django allauth 中的注册表单?

我正在使用 Django Rest 框架构建 API,其中 Django Allauth 负责我的注册注册。实施后一切正常:

Signup Form

在此注册表单上,我想删除用户名字段并将其替换为年龄字段。我知道,要实现这一点,我需要配置 ACCOUNT_FORMS,但是我应该如何创建此表单?

# settings.py

ACCOUNT_FORMS = {
    "signup": "user.forms.MyCustomSignupForm",}

# models.py

class User(AbstractBaseUser,PermissionsMixin):
    """Custom user model that supports using email instead of username"""
    email = models.EmailField(max_length=255,unique=True)
    name = models.CharField(max_length=255)
    age = models.IntegerField()
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    def __str__(self):
        return self.email


# forms.py

from django import forms
from allauth.account.forms import SignupForm


class MyCustomSignupForm(SignupForm):

解决方法

我有一个自定义的 allauth 注册表单,它只需要一个电子邮件地址。

我的表格是这样的;

# settings.py
ACCOUNT_FORMS = {
    'signup': 'accounts.forms.SignupForm',}
from django import forms
from django.conf import settings
from django.utils.translation import ugettext,ugettext_lazy as _

from allauth.account.forms import SignupForm as BaseSignupForm


class SignupForm(BaseSignupForm):
    email = forms.EmailField(
        widget=forms.TextInput(
            attrs={
                'type': 'email','placeholder': _('E-mail address')
            }
        )
    )

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

        if settings.SIGNUP_EMAIL_ENTER_TWICE:
            self.fields["email2"] = forms.EmailField(
                label=_("E-mail (again)"),widget=forms.TextInput(
                    attrs={
                        'type': 'email','placeholder': _('E-mail address confirmation')
                    }
                )
            )

        self.fields['email'].label = ugettext("E-mail")
        self.fields['email'].required = True

        to_remove = [
            'username','password1','password2'  # ignored when not present
        ]
        for field in to_remove:
            if field in self.fields:
                del self.fields[field]

所以你可以做这样的事情,只需添加你的 age 字段。

,

在此注册表单上,我想删除用户名字段并替换 它用于 Age 字段。我知道,要实现这一点,我需要配置 ACCOUNT_FORMS,但是我应该如何创建这个表单?

创建新的注册表单不会改变任何内容。您无需在此处创建注册表单即可更改注册中的必填字段。您需要在您的用户模型和设置中进行更改。

REQUIRED_FIELDS 中注册您的必填字段,如下所示。

class User(AbstractBaseUser,PermissionsMixin):
    """Custom user model that supports using email instead of username"""
    email = models.EmailField(max_length=255,unique=True)
    name = models.CharField(max_length=255)
    age = models.IntegerField()
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    objects = UserManager()
    USERNAME_FIELD = 'email'
    # email is added to this list automatically
    REQUIRED_FIELDS = ['name','age'] 
    def __str__(self):
        return self.email
        

并且您需要在 settings.py 井中进行必要的更改,例如:

ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = True

您可以根据需要更改选项.. 现在注册表将有 5 个字段:电子邮件、姓名、年龄、密码 1、密码 2。

然后您可以通过覆盖 allauth 的注册表单来创建自己的注册表单以添加自动对焦或更新小部件等。

from allauth.account.forms import SignupForm as allauth_SignupForm
    
class SignupForm(allauth_SignupForm):
    def __init__(self,**kwargs):
        super(SignupForm,self).__init__(*args,**kwargs)
            self.fields['email'].widget.attrs.update(
                {"autofocus": "autofocus","class": "form-control"})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。