it's my first time posting a question in stack overflow so bear with me :D I'm trying to create a staff model from a form but an error keep persisting
This is my models file :
class CustomUser(AbstractUser):
user_type_data = ((1, "HOD"), (2, "Consultant"))
user_type = models.CharField(default=1, choices=user_type_data, max_length=10)
class Consultant(models.Model):
CHOICES = (
('P', 'au paiement'),
('J15', 'J+15'),
('J30', 'J+30'),
)
id = models.AutoField(primary_key=True)
admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
client_id=models.ForeignKey(Client,on_delete=models.CASCADE,default=1)
tarif_facturation = models.IntegerField(blank=True, null=True)
tarif_Consultant = models.IntegerField(blank=True, null=True)
cnss = models.IntegerField(blank=True, null=True)
rib = models.IntegerField(blank=True, null=True)
paiement = models.CharField(max_length=300, choices=CHOICES)
profile_pic = models.FileField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
@receiver(post_save,sender=CustomUser)
def create_user_profile(sender,instance,created,**kwargs):
if created:
if instance.user_type == 1:
AdminHOD.objects.create(admin=instance)
if instance.user_type == 2:
Consultant.objects.create(admin=instance, client_id=Client.objects.get(id=1), tarif_Consultant="", tarif_facturation="", cnss="", rib="", paiement="")
@receiver(post_save,sender=CustomUser)
def save_user_profile(sender,instance,**kwargs):
if instance.user_type==1:
instance.adminhod.save()
if instance.user_type==2:
instance.consultant.save()
My views:
def add_staff_save(request):
if request.method!="POST":
return HttpResponse("Method Not Allowed")
else:
email=request.POST.get("email")
password=request.POST.get("password")
first_name=request.POST.get("first_name")
last_name=request.POST.get("last_name")
username=request.POST.get("username")
client_id=request.POST.get("client")
tarif_facturation=request.POST.get("tarif_facturation")
tarif_Consultant=request.POST.get("tarif_Consultant")
cnss = request.POST.get("cnss")
rib = request.POST.get("rib")
paiement = request.POST.get("paiement")
#try:
user=CustomUser.objects.create_user(username=username,password=password,email=email,last_name=last_name,first_name=first_name,user_type=2)
client_obj=Client.objects.get(id=client_id)
user.consultants.client_id=client_obj
user.consultant.tarif_facturation=tarif_facturation
user.consultant.tarif_Consultant=tarif_Consultant
user.consultant.cnss=cnss
user.consultant.rib=rib
user.consultant.paiement=paiement
user.save()
Here is the Traceback :
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'gestion']
Installed 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',
'gestion.LoginCheckMiddleWare.LoginCheckMiddleWare']
Traceback (most recent call last):
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\fields\__init__.py", line 1774, in get_prep_value
return int(value)
The above exception (invalid literal for int() with base 10: '') was the direct cause of the following exception:
File "C:\Users\WD\Miniconda3\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
**File "C:\Users\WD\Desktop\weserveit\gestion\HodViews.py", line 95, in add_staff_save
user=CustomUser.objects.create_user(username=username,password=password,email=email,last_name=last_name,first_name=first_name,user_type=2)**
File "C:\Users\WD\Miniconda3\lib\site-packages\django\contrib\auth\models.py", line 146, in create_user
return self._create_user(username, email, password, **extra_fields)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\contrib\auth\models.py", line 140, in _create_user
user.save(using=self._db)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\contrib\auth\base_user.py", line 67, in save
super().save(*args, **kwargs)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\base.py", line 751, in save
force_update=force_update, update_fields=update_fields)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\base.py", line 800, in save_base
update_fields=update_fields, raw=raw, using=using,
File "C:\Users\WD\Miniconda3\lib\site-packages\django\dispatch\dispatcher.py", line 179, in send
for receiver in self._live_receivers(sender)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\dispatch\dispatcher.py", line 179, in <listcomp>
for receiver in self._live_receivers(sender)
**File "C:\Users\WD\Desktop\weserveit\gestion\models.py", line 134, in create_user_profile
Consultant.objects.create(admin=instance, client_id=Client.objects.get(id=1), tarif_Consultant="", tarif_facturation="", cnss="", rib="", paiement="", profile_pic="")
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\manager.py", line 85, in manager_method**
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\base.py", line 751, in save
force_update=force_update, update_fields=update_fields)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\base.py", line 789, in save_base
force_update, using, update_fields,
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\base.py", line 892, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\base.py", line 932, in _do_insert
using=using, raw=raw,
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\sql\compiler.py", line 1394, in execute_sql
for sql, params in self.as_sql():
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\sql\compiler.py", line 1339, in as_sql
for obj in self.query.objs
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\sql\compiler.py", line 1339, in <listcomp>
for obj in self.query.objs
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\sql\compiler.py", line 1338, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\sql\compiler.py", line 1279, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\fields\__init__.py", line 823, in get_db_prep_save
return self.get_db_prep_value(value, connection=connection, prepared=False)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\fields\__init__.py", line 818, in get_db_prep_value
value = self.get_prep_value(value)
File "C:\Users\WD\Miniconda3\lib\site-packages\django\db\models\fields\__init__.py", line 1778, in get_prep_value
) from e
Exception Type: ValueError at /add_staff_save Exception Value: Field 'tarif_facturation' expected a number but got ''.
The issue is in your creation of the Conslutant
object in the post_save
Consultant.objects.create(
admin=instance,
client_id=Client.objects.get(id=1),
tarif_Consultant="",
tarif_facturation="",
cnss="",
rib="",
paiement=""
)
tarif_facturation
is an IntegerField
but right there your value is an empty string. Make that value a number and that error will be resolved.
However you're doing the exact same thing for lots of those other attributes that you're setting in the Consultant
creation, so just make sure your values match the types the model requires.
Something like this;
Consultant.objects.create(
admin=instance,
client_id=Client.objects.get(id=1),
tarif_facturation=1,
)