'(IntegrityError at /Hod/Student/Add/ NOT NULL constraint failed: apps_customuser.username)
My data are not posted to the database (each fields are going but not the username)
#my models
class CustomUser(AbstractUser):
USER = (
(1,'HOD'),
(2, 'STAFF'),
(3, 'STUDENT'),
)
user_type = models.CharField(choices=USER,max_length=50,default=1)
profile_pic = models.ImageField(upload_to='media/profile_pic')
class Course(models.Model):
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Session_Year(models.Model):
session_start = models.CharField(max_length=100)
session_end = models.CharField(max_length=100)
def __str__(self) :
return self.session_start + " To " + self.session_end
class Student(models.Model):
admin = models.OneToOneField(CustomUser,on_delete=models.CASCADE)
address = models.TextField()
gender = models.CharField(max_length=100)
roll = models.IntegerField()
course_id = models.ForeignKey(Course,on_delete=models.DO_NOTHING)
session_year_id = models.ForeignKey(Session_Year,on_delete=models.DO_NOTHING)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
#my views
@login_required(login_url='/')
def Add_Student(request):
course = Course.objects.all()
session_year = Session_Year.objects.all()
if request.method == 'POST':
profile_pic = request.FILES.get('profile_pic')
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
email = request.POST.get('email')
username = request.POST.get('username')
password = request.POST.get('password')
address = request.POST.get('password')
roll = request.POST.get('roll')
gender = request.POST.get('gender')
course_id = request.POST.get('course_id')
session_year_id = request.POST.get('session_year_id')
if CustomUser.objects.filter(email=email).exists():
messages.warning(request,'Email is Already Taken')
return redirect('add_student')
if CustomUser.objects.filter(username=username).exists():
messages.warning(request, 'UserName is Already Taken')
return redirect('add_student')
else:
user = CustomUser(
first_name = first_name,
last_name = last_name,
username = username,
email = email,
profile_pic = profile_pic,
user_type = 3
)
user.set_password(password)
user.save()
course = Course.objects.get(id=course_id)
session_year = Session_Year.objects.get(id=session_year_id)
student = Student(
admin = user,
address = address,
session_year_id = session_year,
course_id = course,
gender = gender,
roll = roll,
)
student.save()
messages.success(request,'Student Successfully Saved')
return redirect('add_student')
context = {
"course":course,
"session_year":session_year,
}
return render(request,'Hod/add_student.html',context)
#html file
<div class="row">
<div class="col-12 col-sm-6">
<div class="form-group">
<label>User Name</label>
<input type="text" class="form-control" required name="username">
</div>
</div>
<div class="col-12 col-sm-6">
<div class="form-group">
<label>Address</label>
<textarea class="form-control" required name="address"></textarea>
</div>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-6">
<label>Gender</label>
<select class="form-group" required name="gender">
<option>Select Gender</option>
<option value="Male">Male</option>
<option value="Female">Female</option>
<option value="Others">Others</option>
</select>
</div>
Solution 1:[1]
This is because your student model is one to one with user You need to handle integrity error while saving student I have handle using try except further more you can raise error message hope you can go further from there as I commented the validation part and please post readable question. try this
from django.db import IntegrityError
if request.method == 'POST':
profile_pic = request.FILES.get('profile_pic')
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
email = request.POST.get('email')
username = request.POST.get('username')
password = request.POST.get('password')
address = request.POST.get('password')
roll = request.POST.get('roll')
gender = request.POST.get('gender')
course_id = request.POST.get('course_id')
session_year_id = request.POST.get('session_year_id')
if CustomUser.objects.filter(email=email).exists():
messages.warning(request,'Email is Already Taken')
return redirect('add_student')
if CustomUser.objects.filter(username=username).exists():
messages.warning(request, 'UserName is Already Taken')
return redirect('add_student')
else:
user = CustomUser(
first_name = first_name,
last_name = last_name,
username = username,
email = email,
profile_pic = profile_pic,
user_type = 3
)
user.set_password(password)
user.save()
course = Course.objects.get(id=course_id)
session_year = Session_Year.objects.get(id=session_year_id)
student = Student(
admin = user,
address = address,
session_year_id = session_year,
course_id = course,
gender = gender,
roll = roll,
)
try:
student.save()
except IntegrityError:
messages.error(request,'duplicate student added.')
messages.success(request,'Student Successfully Saved')
return redirect('add_student')
context = {
"course":course,
"session_year":session_year,
}
return render(request,'Hod/add_student.html',context)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | nava |
