0
votes

I have a custom user model in django made using AbstractUser. I am using the django allauth package for my authentication. I have made custom fields in both but am unable to link both of them.

models.py

from django.db import models
from django.conf import settings
from django.shortcuts import reverse
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    age = models.CharField(max_length=30, blank=True)
    phone = models.CharField(max_length=30, blank=True)
    address = models.CharField(max_length=30,blank=True)
    gender = models.CharField(max_length=30,blank=True)

forms.py

from allauth.account.forms import SignupForm
from django.contrib.auth import get_user_model
from .models import User
class MyCustomSignupForm(SignupForm):

    first_name = forms.CharField(max_length=30, label='First Name')
    last_name = forms.CharField(max_length=30, label='Last Name')
    age = forms.CharField(max_length=30, label='Age')
    phone = forms.CharField(max_length=30, label='Phone Number')
    address = forms.CharField(max_length=30, label='Address')
    gender = forms.CharField(max_length=30,label = 'Gender')
    print('FN',first_name)
    print('Age',age)

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.age = self.cleaned_data['age']
        user.phone = self.cleaned_data['phone']
        user.address = self.cleaned_data['address']
        user.gender = self.cleaned_data['gender']
        user.save()
        return user

I have defined a customUserAdmin

admin.py

from django.contrib import admin
from .models import Medicine,Order,OrderItem,Pharmacy,Address
from django.contrib.auth.admin import UserAdmin
from .models import User
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import get_user_model


class CustomUserAdmin(UserAdmin):
    """Define admin model for custom User model with no username field."""
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name','age','phone','address','gender')}),
        (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                       'groups', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2'),
        }),
    )
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    search_fields = ('email', 'first_name', 'last_name')
    ordering = ('email',)
admin.site.register(get_user_model(), CustomUserAdmin)

I have registered my custom user model in settings.py using

AUTH_USER_MODEL = 'core.User'

In both the django allauth signup page and the custom user model the fields are shown. But when I signup and add values in the custom fields they are not stored in the user model in the database. I am unable to link the signup page and user model.

My custom signup page

Custom user field in admin

1

1 Answers

1
votes

With Django version 3.1.7

Here is a way to save the user's type to database record

forms.py

from django import forms
from allauth.account.forms import SignupForm
from .models import User

class MyCustomSignupForm(SignupForm):

    def __init__(self, *args, **kwargs):
        super(MyCustomSignupForm, self).__init__(*args, **kwargs)
        first_name = forms.CharField(max_length=30, label='First Name')
        last_name = forms.CharField(max_length=30, label='Last Name')
        age = forms.CharField(max_length=30, label='Age')
        phone = forms.CharField(max_length=30, label='Phone Number')
        address = forms.CharField(max_length=30, label='Address')
        gender = forms.CharField(max_length=30,label = 'Gender')

    # Put in custom signup logic
    def custom_signup(self, request, user):
        # Set the user's type from the form reponse
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.age = self.cleaned_data['age']
        user.phone = self.cleaned_data['phone']
        user.address = self.cleaned_data['address']
        user.gender = self.cleaned_data['gender']

        # Save the user's type to their database record
        user.save()

and if it's not worked, look at this: https://dev.to/danielfeldroy/customizing-django-allauth-signup-forms-2o1m