8

I'm using this code (in forms.py) for my custom signup form for allauth:

class RegistrationForm(UserCreationForm):
    birth_date = forms.DateField(widget=extras.SelectDateWidget(years=BIRTH_DATE_YEARS))

    class Meta:
        model = get_user_model()
        fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name', 'gender', 'birth_date', 'city', 'country')

I have of course specified ACCOUNT_SIGNUP_FORM_CLASS in settings.py to point to this form and it displays the fields which I've put in it. However, it does not work on submission, even if I put signup method it never gets invoked. I've tried with the save but still it's the same - it raises an error that one of my custom added fields is blank while creating user and saving it to the database. So, what's the correct code for achieving this?

softzer0
  • 445
  • 2
  • 7
  • 25
  • maybe you have missing allauth option in your project setting! please look my answer and try to adapt – Mbambadev Apr 07 '16 at 23:40
  • I don't, as I stated above I've set `ACCOUNT_SIGNUP_FORM_CLASS` and the form is displayed with all fields correctly. The problem is submission of it. – softzer0 Apr 07 '16 at 23:42

2 Answers2

15

I've made it thanks to @rakwen who has found the correct solution here. I wrote my custom adapter and put it in adapters.py in my app:

from allauth.account.adapter import DefaultAccountAdapter

class AccountAdapter(DefaultAccountAdapter):
    def save_user(self, request, user, form, commit=False):
        data = form.cleaned_data
        user.username = data['username']
        user.email = data['email']
        user.first_name = data['first_name']
        user.last_name = data['last_name']
        user.gender = data['gender']
        user.birth_date = data['birth_date']
        user.city = data['city']
        user.country = data['country']
        if 'password1' in data:
            user.set_password(data['password1'])
        else:
            user.set_unusable_password()
        self.populate_username(request, user)
        if commit:
            user.save()
        return user

Then I've specified ACCOUNT_ADAPTER in settings.py to point to that adapter, and it finally started to work!

Community
  • 1
  • 1
softzer0
  • 445
  • 2
  • 7
  • 25
4

In your project setting.py try to add this line:

verify if you have added this:

AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",
    "allauth.account.auth_backends.AuthenticationBackend",
)

ACCOUNT_SIGNUP_FORM_CLASS = "yourapp.forms.customSignupForm"

In app.models

class CustomModel(models.Model):
    """CustomModel docstring."""

    city = forms.CharField(max_length=75)
    country = forms.CharField(max_length=25)
    other....

In app.forms:

class SignForm(forms.ModelForm):
    """SignForm docstring."""

    username = forms.CharField(
        max_length=30,
    )
    first_name = forms.CharField(
        max_length=30,
    )
    last_name = forms.CharField(
        max_length=30,
    )
    field...

    def myclean():

    def signup(self, request, user):
        """You signup function."""


    # dont forget to save your model

    class Meta:
        model = mymodel.CustomModel
        fields = [
            'city',
            'country',
            'field...',
        ]

Try this method work !

Vlad T.
  • 2,568
  • 3
  • 26
  • 40
Mbambadev
  • 729
  • 1
  • 7
  • 26