Обязательные поля только для чтения в Django - PullRequest
3 голосов
/ 29 мая 2010

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

6 голосов
/ 29 мая 2010

Вы должны выполнить:

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

, а также следите за тем, чтобы не перезаписать значение при обратной передаче.

Кроме того, если по-прежнему возникают проблемы с обязательным полем, вы можете сделать следующее в форме модели:

studentID = forms.CharField(label="A label", help_text="Student ID", required=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...