#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"})