Search code examples
djangoformsviewsetinline

Inline Form Set: Django 'main.Course' has no ForeignKey to 'main.Teacher'


I have this error and cant really to identify the error.In dynamic url routing I identify the url predifining the app name(main) then the url.

<a class="btn btn-info" href="{% url 'main:teacher' teacher.fname %}">View</a>

Could this be related with the error of inline form sets? Models:

class Teacher(models.Model):
    teacher_id = models.AutoField(primary_key=True,blank=True)
    fname = models.CharField(max_length=200)
    lname = models.CharField(max_length=200)
    tsc_no = models.CharField(max_length=200,blank=True,unique=True)
    email = models.CharField(max_length=200,blank=True,unique=True)
    password = models.CharField(max_length=200,blank=True)
    profile_picture = models.ImageField(verbose_name='profile_picture',upload_to='photos/%Y/%m/%d',blank=True)
    national_id = models.CharField(max_length=200,unique=True)
    dob  = models.DateField(blank=True)
    phone_number = PhoneNumberField()
    status = models.CharField(max_length=200)
    clas_teacher = models.CharField(max_length=200,blank=True)
    date_of_join = models.DateField(blank=True)
    timetable_color = models.CharField(max_length=200)

class Course(models.Model):
    course_id = models.AutoField(primary_key=True)
    course_name = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    teacher = models.ManyToManyField(Teacher)

    class Meta:
        ordering = ['course_name']

    def __str__(self):
        return self.course_name

The view:

def addmoreteacher(request,pk_test):


    teacher = Teacher.objects.get(fname=pk_test)
    CourseFormSet = inlineformset_factory(Teacher,Course,fields = ('course_name','description'))
    formset =  CourseFormSet(instance=teacher)

    #form = CourseForm(initial = {'teachers_teaching':teacher})

    if request.method == 'POST':
        #form = TeacherForm(request.POST)
        #print(form)
        formset =  CourseFormSet(request.POST,instance=teacher)
        if formset.is_valid():
            formset.save()
            print("saved")
            return redirect('/')
        else:
            print(formset.errors)

    context = {'formset': formset}
    return render(request = request,template_name='main/addmoreteacher_form.html',context=context)

Solution

  • Change models.py's Course class's teacher field,

    From,

    teacher = models.ManyToManyField(Teacher)

    To,

    models.ForeignKey(Teacher, on_delete=models.CASCADE)