Джанго-Аллах - форма с дополнительными полями регистрации - PullRequest
0 голосов
/ 11 октября 2019

Я использую 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 ), но это все еще нене работает должным образом для меня. Как сохранить возраст пользователя, любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...