Я использую django-allauth для аутентификации пользователя. Конфигурация моего проекта выглядит примерно так:
INSTALLED_APPS = [
[...]
'authentication',
'django.contrib.sites',
# 3rd party
'allauth',
'allauth.account',
'allauth.socialaccount',
]
#<======================================================DJANGO ALLAUTH=================================================>
AUTH_USER_MODEL = 'authentication.CustomUser'
# emaillogin_project/settings.py
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
AUTHENTICATION_BACKENDS = (
# Needed to login by username in Django admin, regardless of `allauth`
"django.contrib.auth.backends.ModelBackend",
# `allauth` specific authentication methods, such as login by e-mail
"allauth.account.auth_backends.AuthenticationBackend",
)
SITE_ID = 1
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = True
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False
ACCOUNT_SESSION_REMEMBER = True
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_UNIQUE_EMAIL = True
# ocpjonalnie emaillogin_project/settings.py
LOGIN_REDIRECT_URL = 'seller:home' #redirect
ACCOUNT_LOGOUT_REDIRECT_URL = 'seller:home' #rediect
#login form
ACCOUNT_FORMS = {'signup': 'authentication.forms.SimpleSignupForm'}
Моя пользовательская модель:
from django.db import models
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
age = models.CharField(max_length=20, blank=True, null=True)
def __str__(self):
return self.email
template.html (я использую стандартные поля для хрустящего поля, как в примере)
[...]
{{ form.email|as_crispy_field }}
[...]
И мой файл forms.py, к которому у меня есть вопросы (я не понимаю, как это работает).
1.) Форма в этой конфигурациисоздает пользователя и записывает имя (в объекте), сохранение возраста не работает. Почему?
class SimpleSignupForm(SignupForm):
age = forms.CharField(max_length=30, label='First Name')
first_name = forms.CharField(max_length=30, label='First Name')
def __init__(self, *args, **kwargs):
super(SimpleSignupForm, self).__init__(*args, **kwargs)
#change fields
self.fields['email'].widget = forms.TextInput(attrs={'type': 'email',
'placeholder': 'nazwa@przyklad.pl'})
self.fields['username'].widget = forms.TextInput(attrs={'type': 'text',
'placeholder': 'przyklad91'})
self.fields['password1'].widget = forms.PasswordInput(attrs={'type': 'password',
'placeholder': '*************'})
#change labels
self.fields['email'].label = ''
self.fields['username'].label = ''
self.fields['password1'].label = ''
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.age = self.cleaned_data['age']
user.save()
return user
2.) Форма в этой конфигурации создает пользователя и не сохраняет имя и возраст. Почему (я не изменяю имя поля, но имя формы, отображаемой в шаблоне)?
class SimpleSignupForm(SignupForm):
age = forms.CharField(max_length=30, label='First Name')
name = forms.CharField(max_length=30, label='First Name') #<-- here change
def __init__(self, *args, **kwargs):
super(SimpleSignupForm, self).__init__(*args, **kwargs)
#change fields
self.fields['email'].widget = forms.TextInput(attrs={'type': 'email',
'placeholder': 'nazwa@przyklad.pl'})
self.fields['username'].widget = forms.TextInput(attrs={'type': 'text',
'placeholder': 'przyklad91'})
self.fields['password1'].widget = forms.PasswordInput(attrs={'type': 'password',
'placeholder': '*************'})
#change labels
self.fields['email'].label = ''
self.fields['username'].label = ''
self.fields['password1'].label = ''
def signup(self, request, user):
user.first_name = self.cleaned_data['name'] #<-- here change
user.age = self.cleaned_data['age']
user.save()
return user
Я нашел много учебных пособий о том, как сохранять данные в пользовательских полях модели пользователя с помощью django-allauth ( first , second ), но это все еще нене работает должным образом для меня. Как сохранить возраст пользователя, любая помощь будет оценена.