fakeMake
fakeMake

Reputation: 778

How do I pass an instance to a view?

I'm not able to understand the complaint that the system is returning. Here is the view for the system

 def AddMarksView(request):
        class_name = request.session.get('class_name')
        subject = Subject.objects.filter(name='Maths')
        exam = Exam.objects.filter(name='Endterm')
        students =  Students.objects.filter(school=request.user.school,klass__name = class_name,stream__name='South')
        if request.method == 'POST':
            for student in students:
                marks = int(request.POST['marks'])
                marks_object = Marks.objects.create(student=student,marks=marks,subject=subject,exam=exam)
        else:
            return render(request,'feed_marks.html')
        return redirect('search_m')

The error returned is

Cannot assign "<QuerySet [<Exam: Endterm>]>": "Marks.exam" must be a "Exam" instance.

The model for Marks odel is

class Marks(models.Model):
    exam = models.ForeignKey(Exam,on_delete=models.SET_NULL,null=True,blank=True)
    subject = models.ForeignKey(Subject,on_delete=models.SET_NULL,null=True,blank=True)
    student = models.ForeignKey(Students,on_delete=models.SET_NULL,null=True,blank=True)
    marks = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(100),] ,null=True,blank=True)

How can I format the view so tha it returns no error?

Upvotes: 1

Views: 35

Answers (1)

Ptar
Ptar

Reputation: 178

Instead of filter try get so that your code reads.

def AddMarksView(request):
        class_name = request.session.get('class_name')
        subject = Subject.objects.get(name='Maths')
        exam = Exam.objects.get(name='Endterm')
        students =  Students.objects.filter(school=request.user.school,klass__name = class_name,stream__name='South')
        if request.method == 'POST':
            for student in students:
                marks = int(request.POST['marks'])
                marks_object = Marks.objects.create(student=student,marks=marks,subject=subject,exam=exam)
        else:
            return render(request,'feed_marks.html')
        return redirect('search_m')

Upvotes: 1

Related Questions