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

Django allauth中的Django订购字段

如何解决Django allauth中的Django订购字段

我正在尝试按“全名”,“电子邮件”,然后“密码”的顺序对字段进行排序,但现在依次是“电子邮件”,“ full_name”和“密码”。

Here is the image

我尝试将其添加到我的注册表单中,但不起作用:

if 'keyOrder' in self.fields:
     self.fields.keyOrder = ['full_name','email','password'] 

这是我的其余文件

forms.py

from allauth.account.forms import SignupForm
from django.contrib.auth.forms import UserCreationForm,UserChangeForm

from django import forms

from .models import CustomUser


class CustomSignupForm(SignupForm):
    full_name = forms.CharField(max_length=50,label='Full Name')
    
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

        self.fields['full_name'].widget.attrs.update({'autofocus': 'autofocus'})
        
        # Doesn't work
        if 'keyOrder' in self.fields:
            self.fields.keyOrder = ['full_name','password'] 
       
        for fieldname in ['password1']:
            self.fields[fieldname].help_text = "Your password"

adapters.py

在这里,我将全名保存为customuser模型

from allauth.account.adapter import DefaultAccountAdapter
from django import forms

class UserAccountAdapter(DefaultAccountAdapter):
    
    def save_user(self,request,user,form,commit=True):
        """
        This is called when saving user via allauth registration.
        We override this to set additional data on user object.
        """
        user = super(UserAccountAdapter,self).save_user(request,commit=False)
        user.full_name = form.cleaned_data.get('full_name')
        user.save()

在settings.py中 这些是我在设置文件底部设置的django all-auth配置

AUTH_USER_MODEL = 'accounts.CustomUser' 


# django-allauth config
LOGIN_REDIRECT_URL = 'home'
ACCOUNT_logoUT_REDIRECT = 'home' # new
SITE_ID = 1 # new
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend','allauth.account.auth_backends.AuthenticationBackend',# new
)
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # new
ACCOUNT_SESSION_REMEMBER = True # new
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False # new
ACCOUNT_USERNAME_required = False # new
ACCOUNT_AUTHENTICATION_METHOD = 'email' # new
ACCOUNT_EMAIL_required = True # new
ACCOUNT_UNIQUE_EMAIL = True # new

ACCOUNT_FORMS = {
'signup': 'accounts.forms.CustomSignupForm',}
ACCOUNT_ADAPTER = 'accounts.adapter.UserAccountAdapter'
# ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 300
ACCOUNT_LOGIN_ON_PASSWORD_RESET = True

models.py 这些是我制作的customuser模型。在迁移任何内容之前,我一定要写下来

from django.contrib.auth.models import AbstractUser
from django.db import models
from uuid import uuid4

# Create your models here.
class CustomUser(AbstractUser):
    id = models.UUIDField( # new
        primary_key=True,default=uuid4,editable=False,max_length=70)
    full_name = models.CharField(max_length=75,blank=True)
    bio = models.TextField(max_length=250,blank=True)

    def __str__(self):
        return str(self.full_name)
 

解决方法

您可以设置field_order属性以覆盖default_field_order(来自BaseSignupForm source

   set_form_field_order(
        self,getattr(self,'field_order',None) or default_field_order)

所以在您的情况下,类似

class CustomSignupForm(SignupForm):
    ...
    field_order = ['full_name','email','password'] 
    ...

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