Иногда вы хотите изменить формы регистрации Django, чтобы включить больше полей данных. В этом уроке у меня есть вымышленное приложение под названием «Spybook», социальная сеть для секретных оперативников. При запуске есть только два типа пользователей: «Spy» и «Driver». Пользователи должны иметь возможность выбирать, какой из них они.
Наш пример будет создавать код из моего CookieCutter Django Проект, но должен быть переносным для любого проекта, используя Django Allauth.
Внизу config/settings/base.py
, прошлое в следующем фрагменте кода:
# Control the forms that django-allauth uses ACCOUNT_FORMS = { "login": "allauth.account.forms.LoginForm", "add_email": "allauth.account.forms.AddEmailForm", "change_password": "allauth.account.forms.ChangePasswordForm", "set_password": "allauth.account.forms.SetPasswordForm", "reset_password": "allauth.account.forms.ResetPasswordForm", "reset_password_from_key": "allauth.account.forms.ResetPasswordKeyForm", "disconnect": "allauth.socialaccount.forms.DisconnectForm", # Use our custom signup form "signup": "spybook.users.forms.SpyBookSignupForm", }
В
, Cookiecutter django imports django.contrib.auth.forms
как формы
. Это проблема пространства имен, так как обычно django.forms
обычно импортируется как простые формы
Анкет Чтобы решить это, давайте просто импортируем django.forms
Под другим пространством имен:
# Importing django.forms under a special namespace because of my old mistake from django import forms as d_forms
Прямо под этими формами импорта, получите Регистрация
:
from allauth.account.forms import SignupForm
Вместо того, чтобы написать длинное объяснение, я просто прокомментирую каждую строку кода.
# SpyBookSignupForm inherits from django-allauth's SignupForm class SpyBookSignupForm(SignupForm): # Specify a choice field that matches the choice field on our user model type = d_forms.ChoiceField(choices=[("SPY", "Spy"), ("DRIVER", "Driver")]) # Override the init method def __init__(self, *args, **kwargs): # Call the init of the parent class super().__init__(*args, **kwargs) # Remove autofocus because it is in the wrong place del self.fields["username"].widget.attrs["autofocus"] # Put in custom signup logic def custom_signup(self, request, user): # Set the user's type from the form reponse user.type = self.cleaned_data["type"] # Save the user's type to their database record user.save()
Я написал это на своем живом потоке, который вы можете посмотреть на моем YouTube и Twitch каналы. Я также соберу короткую видео -презентацию того, как это работает. Конечно, код для этого можно найти на GitHub Анкет
Если вы хотите выучить все виды продвинутых трюков и советов, посмотрите на мою тематическую тематическую мороженое Книга и Курс На лучших практиках Джанго.
Оригинал: “https://dev.to/danielfeldroy/customizing-django-allauth-signup-forms-2o1m”