3 Stimmen

Obligatorische schreibgeschützte Felder in django

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X