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?
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!
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 !
来源:https://stackoverflow.com/questions/36488743/django-allauth-overriding-default-signup-form