django中必填的只读字段

时间:2010-05-29 02:11:27

标签: django django-models django-forms

我正在写一本测试“成绩簿”应用程序。 models.py文件如下所示。

class Student(models.Model):
    name = models.CharField(max_length=50)
    parent = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name

class Grade(models.Model):
    studentId = models.ForeignKey(Student)
    finalGrade = models.CharField(max_length=3)

我希望能够在一个模型中改变几个学生的最终成绩,但现在我只是尝试一个学生。我也试图为它创建一个表单,将学生姓名显示为一个无法更改的字段,这里唯一可以更改的是finalGrade。所以我用这个技巧让studentId只读。

class GradeROForm(ModelForm):
    studentId = forms.ModelChoiceField(queryset=Student.objects.all())
    def __init__(self, *args, **kwargs):
        super(GradeROForm,self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['studentId'].widget.attrs['disabled']='disabled'
    def clean_studentId(self):
        instance = getattr(self,'instance',None)
        if instance:
            return instance.studentId
        else:
            return self.cleaned_data.get('studentId',None)
    class Meta:
        model=Grade

以下是我的观点:

def modifyGrade(request,student):
    student = Student.objects.get(name=student)
    mygrade = Grade.objects.get(studentId=student)
    if request.method == "POST":
        myform = GradeROForm(data=request.POST, instance=mygrade)
        if myform.is_valid():
            grade = myform.save()
            info = "successfully updated %s" % grade.studentId
    else:
        myform=GradeROForm(instance=mygrade)
    return render_to_response('grades/modifyGrade.html',locals())

这会显示我期望的表单,但是当我点击“提交”时,我会收到学生字段的表单验证错误,告诉我这个字段是必需的。我猜测,由于该字段是“禁用的”,因此POST中没有报告该值,并且由于我不知道该实例未在其位置使用。

我是一名新的Django / Python程序员,但在其他语言方面经验丰富。我无法相信我在我的第一个重要的django应用程序中偶然发现了这么难以解决的问题。我想我必须遗漏一些东西。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

你应该执行:

self.fields['studentId'].widget.attrs['readonly'] = True

并确保不要覆盖回发上的值。

此外,如果仍然存在必填字段的问题,您可以在模型中执行以下操作:

studentID = forms.CharField(label="A label", help_text="Student ID", required=False)