Ich schreibe eine Testanwendung "Notenbuch". Die Datei models.py ist unten abgebildet.
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)
Ich würde gerne die Endnote für mehrere Schüler in einem Modellformularsatz ändern können, aber im Moment versuche ich es nur mit einem Schüler auf einmal. Ich versuche auch, ein Formular dafür zu erstellen, das den Namen des Schülers als ein Feld anzeigt, das nicht geändert werden kann, das einzige, was hier geändert werden kann, ist die finalGrade. Also habe ich diesen Trick angewendet, um die studentId schreibgeschützt zu machen.
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
Und das ist meine Meinung:
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())
Das Formular wird so angezeigt, wie ich es erwarte, aber wenn ich auf "Absenden" klicke, erhalte ich einen Validierungsfehler für das Feld "Student", der mir sagt, dass dieses Feld erforderlich ist. Ich vermute, dass, da das Feld "deaktiviert" ist, der Wert nicht in der POST gemeldet wird und aus mir unbekannten Gründen die Instanz nicht an seiner Stelle verwendet wird.
Ich bin ein neuer Django/Python-Programmierer, aber ziemlich erfahren in anderen Sprachen. Ich kann nicht glauben, dass ich auf ein so schwer zu lösendes Problem in meiner ersten bedeutenden Django-App gestoßen bin. Ich denke, ich muss etwas übersehen. Irgendwelche Ideen?