如何使用django表单为多个不同的对象赋值

时间:2017-02-18 22:09:00

标签: python django django-forms

我是django的新手。我正在建立一个教师公用事业网站,它将帮助跟踪学生在不同课程和作业中的成绩。目前我已经为一个类创建了一个页面,我在一个表中显示信息,其中学生是行,每个作业都是列。

我想创建一个“编辑”页面,我可以用与主类页面相同的格式修改每个作业的学生成绩。因此,不是表格的每个“单元格”中的等级,而是在页面底部有一个带有保存按钮的输入字段。而且我不确定如何实现这一目标。如何使表单为特定学生/作业对分配值?我怎样才能为每个学生/作业对提供多个表格?我尝试使用(不成功)使用formset但我无法在这方面取得很大进展。

以下是我的模特

color

这是我对表单的尝试

class Student(models.Model):
    name = models.CharField(max_length=40)
    section = models.ForeignKey(Section, blank=False, on_delete=models.PROTECT)
    subjects = models.ManyToManyField(Subject)

    def __str__(self):
        return self.name

class Assignment(models.Model):

    section = models.ForeignKey(Section, blank=False, on_delete=models.PROTECT)
    subject = models.ForeignKey(Subject, blank=False, on_delete=models.PROTECT)
    assign_date = models.DateField('date assigned', primary_key=True)
    def __str__(self):
        return self.assign_date.strftime('%d/%m/%y')
    class Meta:
        unique_together = ('section', 'assign_date')

class AssignmentScore(models.Model):
    student = models.ForeignKey(Student, blank=False, on_delete=models.PROTECT)
    assignment = models.ForeignKey(Assignment, blank=False, on_delete=models.PROTECT)
    assignment_score = models.PositiveIntegerField(validators=[MaxValueValidator(5)], blank=False)
    class_assignment_score = models.PositiveIntegerField(validators=[MaxValueValidator(5)], blank=False)
    def __str__(self):
        return str(self.assignment_score)
    class Meta:
        unique_together = ('student', 'assignment')

这是用于生成类页面的html Im

class GradeForm(forms.ModelForm):
    # def __init__(self, *args, **kwargs):
    #     super(GradeForm, self).__init__(*args, **kwargs)
    #     self.fields['assignment_score'].widget.attrs['style'] = "width:50px"
    class Meta:
        model = AssignmentScore
        fields = ('assignment_score', 'class_assignment_score')
        widgets = {
            'assignment_score': forms.TextInput(attrs={'size':1}),
            'class_assignment_score': forms.TextInput(attrs={'size':1})
        }
        labels = {
            'assignment_score': '',
            'class_assignment_score': '',
        }

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

这当然是可能的。但您必须在表单清理方法中手动执行此操作。见:https://docs.djangoproject.com/en/1.10/ref/forms/validation/#validating-fields-with-clean

特定值的POST数据可以是值列表。因此,如果前端POST有一个列表[[<student_id>, <assignment_id>, <assignment_score>, <class_assignment_score>] ... ],那么在您的干净方法中,您可以将这些值转换回实际的AssignmentScore模型。

这是否是最好的方法? Django Forms不直接支持它。但我过去肯定做过类似的事情。