@@ -23,9 +23,6 @@ class CustomSignupForm(SignupForm):
2323 queryset = Role .objects .all ().order_by ('order' ),
2424 required = True
2525 )
26- username = forms .CharField (
27- widget = forms .HiddenInput (),
28- required = False )
2926
3027 def __init__ (self , * args , ** kwargs ):
3128 super (CustomSignupForm , self ).__init__ (* args , ** kwargs )
@@ -35,35 +32,49 @@ def __init__(self, *args, **kwargs):
3532 self .fields ['role' ].initial = first_role
3633 except Role .DoesNotExist :
3734 pass
35+ # For django-allauth 65.x: properly configure username field
36+ if 'username' in self .fields :
37+ self .fields ['username' ].required = False
38+ self .fields ['username' ].widget = forms .HiddenInput ()
3839
39- def clean_username (self ):
40- username = self .cleaned_data .get ('username' )
41- if not username :
42- new_username = '{first_name}_{last_name}' .format (
43- first_name = self .data .get ('first_name' ).lower (),
44- last_name = self .data .get ('last_name' ).lower ()
45- )
46- if Profile .objects .filter (user__username = new_username ).exists ():
40+ def clean (self ):
41+ """Override clean to generate username before form validation completes."""
42+ cleaned_data = super ().clean ()
43+
44+ # Generate username from first_name and last_name if not provided
45+ if not cleaned_data .get ('username' ):
46+ first_name = cleaned_data .get ('first_name' , '' ).lower ()
47+ last_name = cleaned_data .get ('last_name' , '' ).lower ()
48+
49+ if first_name and last_name :
50+ base_username = f'{ first_name } _{ last_name } '
51+ username = base_username
52+
53+ # Ensure uniqueness
54+ from django .contrib .auth import get_user_model
55+ User = get_user_model ()
4756 counter = 1
48- unique_username = new_username
49- while Profile .objects .filter (user__username = unique_username ).exists ():
50- unique_username = f'{ new_username } _{ counter } '
57+ while User .objects .filter (username = username ).exists ():
58+ username = f'{ base_username } _{ counter } '
5159 counter += 1
52- return unique_username
53- return new_username
54- return username
60+
61+ cleaned_data ['username' ] = username
62+
63+ return cleaned_data
5564
5665 def custom_signup (self , request , user ):
66+ """Called after the user is created to set additional fields."""
5767 user .first_name = self .cleaned_data ['first_name' ]
5868 user .last_name = self .cleaned_data ['last_name' ]
5969 user .organization = self .cleaned_data ['organization' ]
60- user . username = self . cleaned_data . get ( 'username' , user . email )
70+ # Username is already set from clean() method
6171 user .save ()
62- bims_profile , created = Profile . objects . get_or_create (
63- user = user
64- )
72+
73+ # Create or get the BIMS profile
74+ bims_profile , created = Profile . objects . get_or_create ( user = user )
6575 bims_profile .role = self .cleaned_data ['role' ]
6676 bims_profile .save ()
77+
6778 return user
6879
6980
0 commit comments