我正在写一本测试“成绩簿”应用程序。 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应用程序中偶然发现了这么难以解决的问题。我想我必须遗漏一些东西。有什么想法吗?
答案 0 :(得分:6)
你应该执行:
self.fields['studentId'].widget.attrs['readonly'] = True
并确保不要覆盖回发上的值。
此外,如果仍然存在必填字段的问题,您可以在模型中执行以下操作:
studentID = forms.CharField(label="A label", help_text="Student ID", required=False)