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