Я пишу тестовое приложение «Зачетная книжка». Файл 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. Я полагаю, что я что-то упускаю. Есть идеи?