'(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