【问题标题】:Django adding foreign keyDjango添加外键
【发布时间】:2021-04-04 18:47:46
【问题描述】:

我正在做一个学生作业提交项目,我制作了提交模型,其中作业作为问题的外键,学生作为个人资料的外键。 我正在研究某种方式,让老师可以选择已提交作业的学生列表并为他们分配分数,我尝试了以下方式,但它的表格没有得到验证,说明“选择一个有效的选择”

提交模型

class Submission(models.Model):
    assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE, verbose_name='assignment')
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, verbose_name='student')
    answer = models.URLField()
    time_submitted = models.DateTimeField(auto_now_add=True)
    marks_obtained = models.IntegerField(null=True)

标记更新表格

class MarksUpdateForm(forms.ModelForm):
    class Meta:
        model = Submission
        fields = ['student', 'marks_obtained']

    def __init__(self, *args, **kwargs):
        self.assignment_id = kwargs.pop('assignment_id', None)
        super(MarksUpdateForm, self).__init__(*args, **kwargs)
        self.fields['student'].queryset = Submission.objects.filter(assignment__id=self.assignment_id).values_list(
            'student__user__username', flat=True)

我的看法

            form = MarksUpdateForm(request.POST)
            if form.is_valid():
                row = Submission.objects.get(id=assignmentId,
                                             student__user__username=form.cleaned_data['student'])
                row.marks_obtained = form.cleaned_data['marks_obtained']
                row.save()
                messages.success(request,
                                 message="Marks Updated Successfully")
            else:
                print(form.errors)

我尝试通过覆盖 label_from_instance 并创建自定义表单而不是模型表单来更新我的标记更新表单,但没有解决“选择有效选择”的错误 谢谢。

【问题讨论】:

    标签: django django-models django-rest-framework django-forms


    【解决方案1】:

    Submission.studentForeignKeyStudentProfile 模型,因此用于 MarksUpdateForm.student 的查询集应该是 StudentProfile 查询集

    self.fields['student'].queryset = StudentProfile.objects.filter(
        submission__assignment_id=self.assignment_id
    )
    

    【讨论】:

    • 是的,我理解那里的错误。但我没有提交作为学生档案模型中的字段,在这种情况下我如何引用学生。
    【解决方案2】:

    以下是通过从StudentProfile 模型中过滤Submission 模型来获取学生查询集的方法

    self.fields['student'].queryset = StudentProfile.objects.filter(
        submission__assignment__id=self.assignment_id
    )
    

    要获取用户名作为选择下拉菜单上的显示文本,您可以更新 StudentProfile 模型,如下所示:

    class StudentProfile(models.Model):
        ...
    
        def __str__(self):
            return self.user.username
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2023-03-27
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2019-08-10
      相关资源
      最近更新 更多