Django переопределение модели User для дополнительных полей для уже созданного проекта

Я новичок в Django и только что прошел этот учебник онлайн, но кодер использовал модель Regular User, которая имеет только поля "User_name, Last_name, Email, Password".

Я пытаюсь добавить дополнительные поля "возраст, пол, отдел и т.д." для пользователей, которые они должны заполнить перед завершением регистрации. Пока мне удалось добавить дополнительные поля в модель User с помощью отношения OnetoOneField, и я могу получить к ним доступ в панели администратора и даже зарегистрировать пользователей с дополнительными полями, но когда я пытаюсь создать нового пользователя с помощью моего файла registration.html или с помощью Shell, я получаю ошибку:

views.py

user = User.objects.create_user(first_name="Test", last_name="Test2", username="Test3", password="Test3333", extra_field="test")

TypeError: User() получил неожиданный аргумент ключевого слова 'extra_field'

Используя форму registrations.html я регистрируюсь без проблем, но дополнительное поле не заполняется или обнуляется.

models.py

from django.db import models
from django.contrib.auth.models import User

class EmployeeDetail(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    empcode = models.CharField(max_length=9, unique=True)
    nnum = models.CharField(max_length=13, default="")
    contact = models.CharField(max_length=15, null=True)
    gender = models.CharField(max_length=50, null=True)
    joiningdate = models.DateField(null=True)

    def __str__(self):
        return self.empcode + ' ' + self.user.first_name + ' ' + self.user.last_name

class EmployeeSalary(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    salary = models.FloatField(default=0)
    x= models.IntegerField(default=520)
    x= models.BooleanField(default=False)
    x= models.IntegerField(default=0)
    def totalsalary(self):
        tsalary = 0
        if self.x:
            tsalary = self.x* 100 + self.salary + self.x
        else:
            tsalary = self.x* 100 + self.salary
        return tsalary

    def __str__(self):
        return self.user.first_name + ' ' + self.user.last_name

class EmployeeEducation(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    coursepg = models.CharField(max_length=100, null=True)
    schoolclgpg = models.CharField(max_length=200, null=True)


class EmployeeExperience(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    company1name = models.CharField(max_length=100, null=True)

urls.py

from django.contrib import admin
from django.urls import path
from employee.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index, name='index'),
    path('registration/', registration, name='registration'),
    path('emp_login/', emp_login, name='emp_login'),
    path('emp_home/', emp_home, name='emp_home'),
    path('profile/', profile, name='profile'),
    path('logout/', Logout, name='logout'),
    path('admin_login/', admin_login, name='admin_login'),
    path('my_experience/', my_experience, name='my_experience'),
    path('edit_myexperience/', edit_myexperience, name='edit_myexperience'),
    path('my_education/', my_education, name='my_education'),
    path('edit_myeducation/', edit_myeducation, name='edit_myeducation'),
    path('change_password/', change_password, name='change_password'),
    path('admin_home/', admin_home, name='admin_home'),
    path('change_passwordadmin/', change_passwordadmin, name='change_passwordadmin'),
    path('all_employee/', all_employee, name='all_employee'),
    path('delete_employee/<int:pid>', delete_employee, name='delete_employee'),
    path('edit_profile/<int:pid>', edit_profile, name='edit_profile'),
    path('edit_education/<int:pid>', edit_education, name='edit_education'),
    path('edit_experience/<int:pid>', edit_experience, name='edit_experience'),
    path('emp_salary/', emp_salary, name='emp_salary'),
]

registration.html

settings.py

from pathlib import Path

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'employee',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'import_export',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'EmployeeRecordMgmt.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'EmployeeRecordMgmt.wsgi.application'



DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True


STATIC_URL = 'static/'

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

Прошу совета

вы можете наследоваться от класса AbstractUser и использовать одну модель или вы можете использовать сигналы для создания профиля пользователя для получения дополнительной информации

from django.db import models
from django.contrib.auth.models import AbstractUser

class EmployeeDetail(AbstractUser):
    GENDER_CHOICES=(
                    (0,'FEMALE'),
                    (1,'MALE')
                    )
    empcode = models.CharField(max_length=9, unique=True)
    nnum = models.CharField(max_length=13, default="")
    contact = models.CharField(max_length=15, null=True)
    gender = models.CharField(max_length=50,choices=GENDER_CHOICES, null=True,default=0)
    joiningdate = models.DateField(null=True)
    #salary
    salary = models.FloatField(default=0)
    x= models.IntegerField(default=520)
    x1= models.BooleanField(default=False)
    x2= models.IntegerField(default=0)
    

    
    #education
    coursepg = models.CharField(max_length=100, null=True)
    schoolclgpg = models.CharField(max_length=200, null=True)

    # experience
    company1name = models.CharField(max_length=100, null=True)
    def totalsalary(self):
        tsalary = 0
        if self.x:
            tsalary = self.x* 100 + self.salary + self.x
        else:
            tsalary = self.x* 100 + self.salary
        return tsalary
    
    def __str__(self):
        return self.empcode + ' ' + self.user.first_name + ' ' + self.user.last_name

РЕДАКТИРОВАТЬ: и в вашем forms.py вы можете использовать модель формы как

from .models import EmployeeDetail

class signupForm(UserCreationForm):
    class Meta:
        model=EmployeeDetail
        fields='__all__'
        widgets={
            'gender':forms.RadioSelect(),
        }

Вы можете обратиться к документации django для AbstractUser

Вернуться на верх