【问题标题】:How to fix this error in Django, "Cannot assign must be an instance."如何在 Django 中修复此错误,“无法分配必须是实例。”
【发布时间】:2021-07-08 08:53:53
【问题描述】:

我需要帮助来解决这个奇怪的错误。我有一个应用程序,老师可以添加作业,然后学生可以提交作业,然后老师可以对其进行评分。目前,除了对结果进行评分之外,其他所有功能都运行良好。

注意:“STUDENT 1”是要对其作业评分的用户

我知道我在外键字段中使用的是字符串而不是整数,但我怎样才能修复它。有没有办法将字符串转换为整数或如何。我尝试了这种方法,但它似乎不起作用。我尝试了“Student_ID__student_ID”和 course__Course_Name,它们只是要进入模型并使用字符串类型的字段,然后我认为它应该匹配,但我得到了这个错误,而不是“Grade_Student()得到了一个意外的关键字参数'Student_ID__student_ID'”然后我将“Grade_Student(...)”更改为 Grade_Student.objects.update_or_create(...) 然后在 /en/grading_submit 处收到这个新错误“IntegrityError” NOT NULL 约束失败:schoolapp_grade_student.Student_ID_id”,然后我尝试通过将 Grade_Student_data.save() 更改为 Grade_Student_data.save(commit=False) 来修复它,但它仍然是同样的错误。是否有更多信息需要帮助我。

错误日志

Traceback (most recent call last):
  File "C:\Users\Habib\Documents\django\FIVERR\Ayyub_SMS\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Habib\Documents\django\FIVERR\Ayyub_SMS\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Habib\Documents\django\FIVERR\Ayyub_SMS\sms\schoolapp\views.py", line 1948, in grading_submit
    Assignment_name=grade_field_assignment_name, Grade=grade_field, Out_Of_Grade=out_grade_filed)
  File "C:\Users\Habib\Documents\django\FIVERR\Ayyub_SMS\venv\lib\site-packages\django\db\models\base.py", line 483, in __init__
    _setattr(self, field.name, rel_obj)
  File "C:\Users\Habib\Documents\django\FIVERR\Ayyub_SMS\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 220, in __set__
    self.field.remote_field.model._meta.object_name,

Exception Type: ValueError at /en/grading_submit
Exception Value: Cannot assign "'STUDENT 1'": "Grade_Student.Student_ID" must be a "add_students_by_manager" instance.

models.py

class add_courses(models.Model):
    Course_Name = models.CharField(max_length=200, blank=True)
    Manager_Name = models.ForeignKey(Manager_login_information, on_delete=models.CASCADE, blank=True)
    student = models.ManyToManyField(add_students_by_manager, blank=True)

    # Start Habib
    start_date = models.DateField()
    end_date = models.DateField()
    # End Habib

    def __str__(self):
        return self.Course_Name


class add_students_by_manager(models.Model):
    manager_ID = models.ForeignKey(Manager_login_information, on_delete=models.CASCADE)
    student_ID = models.CharField(max_length=200)
    student_name = models.CharField(max_length=200)

    def __str__(self):
        return self.student_name

class Grade_Student(models.Model):
    Student_ID = models.ForeignKey(add_students_by_manager, on_delete=models.CASCADE)
    course = models.ForeignKey(add_courses, on_delete=models.CASCADE)
    Assignment_name = models.CharField(max_length=200)
    Grade = models.IntegerField()
    Out_Of_Grade = models.IntegerField()

    def __str__(self):
        return str(self.Student_ID) + " scored " + str(self.Grade) + " out of " + str(self.Out_Of_Grade) + " in " + str(self.course)

views.py

def grading_submit(request):
    if request.method=="POST":

        grade_field_stu_id = request.POST.get('grade_field_stu_id')
        grade_field_course_name = request.POST.get('grade_field_course_name')
        grade_field_assignment_name = request.POST.get('grade_field_assignment_name')
        grade_field = request.POST.get('grade_field')
        out_grade_filed = request.POST.get('out_grade_filed')

        print(grade_field, grade_field_stu_id, grade_field_course_name, grade_field_assignment_name, out_grade_filed)

        Grade_Student_data= Grade_Student(Student_ID=grade_field_stu_id, course=grade_field_course_name, 
            Assignment_name=grade_field_assignment_name, Grade=grade_field, Out_Of_Grade=out_grade_filed)

        Grade_Student_data.save()

        messages.success(request, _("You Successfully Grade a student!"))

        return redirect('assignment_page')
    else:
        return redirect('/')

grading_page.html

<form class="container pt-5" action="{% url 'grading_submit' %}" method="POST">{% csrf_token %}
  <div class="mb-3">
    <label for="exampleInputEmail1" class="form-label">Grade</label>
    <input name="grade_field" type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
    <input name="grade_field_stu_id" value="{{stu_id_grade}}" type="hidden" class="form-control">
    <input name="grade_field_course_name" value="{{stu_course_grade}}" type="hidden" class="form-control">
    <input name="grade_field_assignment_name" value="{{stu_ass_name_grade}}" type="hidden" class="form-control">
    <input name="out_grade_filed" value="{{stu_total_grade}}" type="hidden" class="form-control">
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    实际上,您没有传递正确的实例或 id。而不是 Student_ID,请尝试 Student_ID_id,如下所示:

    Grade_Student_data= Grade_Student(Student_ID_id=grade_field_stu_id, course_id=grade_field_course_name, 
                Assignment_name=grade_field_assignment_name, Grade=grade_field, Out_Of_Grade=out_grade_filed)
    
    Grade_Student_data.save()
    

    其中grade_field_stu_id 将是一个整数ID,即:1. 对您的课程字段也执行相同操作。

    希望它对你有用。

    【讨论】:

    • 我现在来测试一下。谢谢
    • 我试过这样但它不起作用 bcos,“grade_field_stu_id”是一个字符串,但 Student_ID_id 需要一个整数。查看 grading_page.html 并了解它是如何获得的。
    【解决方案2】:

    我可以通过改变这个来解决这个问题:

    Grade_Student_data= Grade_Student(Student_ID=grade_field_stu_id, course=grade_field_course_name, 
                Assignment_name=grade_field_assignment_name, Grade=grade_field, Out_Of_Grade=out_grade_filed)
    

    到这里:

    Grade_Student_data = Grade_Student(Student_ID=add_students_by_manager.objects.get(student_ID=grade_field_stu_id), course=add_courses.objects.get(Course_Name=grade_field_course_name), Assignment_name=grade_field_assignment_name, Grade=grade_field, Out_Of_Grade=out_grade_filed)
    

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 2019-11-14
      • 1970-01-01
      • 2016-05-11
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      相关资源
      最近更新 更多