Как сделать последовательные страницы регистрации с помощью Django allauth?
В настоящее время у меня есть одностраничная форма регистрации, реализованная с помощью allauth
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
email = models.EmailField(_('Professional email address'), unique=True)
username = models.CharField(_("User Name"), blank=False, max_length=255, unique=True)
first_name = models.CharField(_("First Name"), null=True, max_length=255, default='')
last_name = models.CharField(_("Last Name"), null=True, max_length=255, default='')
country = CountryField(_("Country of Practice"), blank_label='(Country of Practice)', blank = False, default='GB')
terms = models.BooleanField(verbose_name=_('I have read and agree to the terms and conditions'), default=False)
def get_absolute_url(self):
return reverse(
"users:detail", kwargs={"username": self.username}
)
objects = UserManager()
А это forms.py
class UserCreationForm(forms.UserCreationForm):
error_message = forms.UserCreationForm.error_messages.update(
{"duplicate_username": _("This username has already been taken.")}
)
username = CharField(label='User Name',
widget=TextInput(attrs={'placeholder': 'User Name'}))
class Meta(forms.UserCreationForm.Meta):
model = User
fields = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2', 'terms']
field_order = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2', 'terms']
def clean_terms(self):
is_filled = self.cleaned_data['terms']
if not is_filled:
raise forms.ValidationError('This field is required')
return is_filled
def clean_username(self):
username = self.cleaned_data["username"]
if self.instance.username == username:
return username
try:
User._default_manager.get(username=username)
except User.DoesNotExist:
return username
raise ValidationError(
self.error_messages["duplicate_username"]
)
Однако я хотел бы, чтобы на первой странице регистрации была кнопка 'next' внизу, а затем была бы вторая страница, где пользователь вводит отдельные данные (данные, вводимые здесь, могут меняться в зависимости от данных на первой странице). Мастер форм Django 'form tools' кажется хорошо подходящим для этого, но я не могу понять, как интегрировать его со всеми auth
Любые предложения будут очень признательны
В качестве первого шага посмотрите на шаблоны в репозитории github:
https://github.com/pennersr/django-allauth/tree/master/allauth/templates/
account/
base.html
...
login.html
....
openid/
...
вы можете проверить оригинальные страницы и изменить/переписать их, создав папки/файлы в папке templates вашего приложения:
your_app/
templates/
your_app/ # this is the app templates standard folder
account/ # this one is to overwrite allauth->account templates
base.html
login.html
...
openid/
...
Тогда можно изменить действие, выполняемое при нажатии на кнопки, и таким образом подцепить промежуточный вид/страницу. Осталось уточнить, как в конечном итоге размещенные параметры сохраняются в цепочке страниц.
Вы можете использовать Django FormWizard
для реализации многостраничной формы для регистрации пользователей, и интегрировать ее с Django AllAuth путем подклассификации FormWizard
и настройки ее поведения по мере необходимости.
Вот базовый пример для начала работы:
from formtools.wizard.views import SessionWizardView
from allauth.account.forms import SignupForm
class UserSignupWizard(SessionWizardView):
form_list = [SignupForm, UserCreationForm]
def done(self, form_list, **kwargs):
# Implement logic to save the form data to the database
# ...
return HttpResponseRedirect(reverse("success_url"))
В приведенном выше примере form_list
- это список форм, которые будут использоваться в мастере. В данном случае вы используете как SignupForm
, предоставляемые Django AllAuth
, так и свои собственные UserCreationForm
. Метод done вызывается, когда все формы в мастере заполнены и отправлены. Именно здесь вы можете реализовать логику для сохранения данных формы в базе данных, отправки подтверждений по электронной почте и т.д.
Обратите внимание, что вам может понадобиться настроить формы или класс UserSignupWizard
под ваши конкретные нужды.