lufee
lufee

Reputation: 169

Django extra registration details not saving

I have form.py with class RegistrationForm and everything works fine but the extra details like email, first and last name, roles is not saved to my account/User profiles but first and last name + emails is saved under AUTHENTICATION AND AUTHORIZATION/Users

I been trying to figure our if I made some mix up with model, form or views.

What could be the problem? Using python 3 with latest django

enter image description here

2nd

enter image description here

3rd

enter image description here

Models.py

class UserProfile(models.Model):
STUDENT = 1
TOURIST = 2
BUSINESS = 3
ADMIN = 4
ROLE_CHOICES = (
    (STUDENT, 'Student'),
    (TOURIST, 'Tourist'),
    (BUSINESS, 'Business'),
    (ADMIN, 'Admin'),
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
# first_name = models.CharField(max_length=100, default='')
# last_name = models.CharField(max_length=100, default='')
email = models.EmailField()
phone = models.IntegerField(default=0)
image = models.ImageField(upload_to='image_profile', blank=True)
role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, null=True, blank=True)

# admin = UserProfileManager()

def __str__(self):
    return self.user.username


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=User)

forms.py

ROLES = ((0, 'Student'), (1, 'Tourist'), (2, 'Business'))


class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)
    role = forms.ChoiceField(choices=ROLES)
class Meta:
    model = User
    fields = (
        'username',
        'first_name',
        'last_name',
        'email',
        'role',
        'password1',
        'password2'
    )

def save(self, commit=True):
    user = super(RegistrationForm, self).save(commit=False)
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    user.role = self.cleaned_data['role']
    user.email = self.cleaned_data['email']

    if commit:
        user.save()

    return user

views.py

def register(request):
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        form.save()
        messages.success(request, 'Your account has been created!')
        return redirect(reverse('city:home'))
else:
    form = RegistrationForm()

    args = {'form': form}
    return render(request, 'account/register_form.html', args)

Admin.py

class UserProfileAdmin(admin.ModelAdmin):
list_display = ('user', 'role', 'email')

def user_info(self, obj):
    return obj.role

def get_queryset(self, request):
    queryset = super(UserProfileAdmin, self).get_queryset(request)
    queryset = queryset.order_by('email')
    return queryset

    role.short_description = 'User Type'

admin.site.register(UserProfile, UserProfileAdmin)

Upvotes: 0

Views: 523

Answers (1)

bhatt ravii
bhatt ravii

Reputation: 382

By given screen shots i think you are using allauth library. If you want to use allauth and modify user model then you have to import AbstractUser class of allauth

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
      phone = models.CharField(_('Telephone'), blank=True, max_length=20)
      address = models.CharField(_('Address'), blank=True, max_length=255)

Upvotes: 1

Related Questions