Как сделать последовательные страницы регистрации с помощью 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 под ваши конкретные нужды.

Вернуться на верх