Как изменить форму регистрации в Django Rest Framework и Django allauth?

#django #django-rest-framework #django-allauth

#django #django-rest-framework #django-allauth

Вопрос:

Я создаю API с помощью Django Rest Framework, где Django Allauth отвечает за мою регистрацию. После реализации все работает нормально: Форма регистрации

В этой форме регистрации я хочу удалить поле имени пользователя и заменить его на поле возраста. Я знаю, что для этого мне нужно настроить 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):

 

Ответ №1:

У меня есть пользовательская форма регистрации для 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 поле.

Комментарии:

1. Привет, Марк, большое спасибо за ваш ответ. Чтобы протестировать это, я просто копирую ваш код в свое приложение django. Но, похоже, я все еще получаю те же поля на странице регистрации Django Rest Framework. Я что-то упускаю?

Ответ №2:

В этой форме регистрации я хочу удалить поле имени пользователя и заменить его на поле возраста. Я знаю, что для этого мне нужно настроить 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, *args, **kwargs):
        super(SignupForm, self).__init__(*args, **kwargs)
            self.fields['email'].widget.attrs.update(
                {"autofocus": "autofocus", "class": "form-control"})