2010-05-29 8 views
3

나는 "시험용 등급"응용 프로그램을 작성하고 있습니다. 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) 
난 그냥 한 번에 한 학생이 노력하고 있어요 modelformset 여러 학생들하지만 지금은 최종 성적을 변경할 수 있도록하고 싶습니다

. 또한 변경할 수없는 필드로 학생 이름을 표시하는 양식을 만들려고합니다. 여기서 변경할 수있는 것은 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()) 

,하지만 난 쳤을 때 나는 날이 필드가됩니다 말하는 학생 필드에 대한 양식 유효성 검사 오류가 "제출" 필수. 나는 그 필드가 "disabled"이기 때문에 값이 POST에서보고되지 않는다고 추측하고있다. 그리고 나에게 알려지지 않은 이유로 그 인스턴스가 그 자리에서 사용되지 않는다.

저는 새로운 Django/Python 프로그래머이지만 다른 언어로도 매우 경험이 있습니다. 내 첫 번째 중요한 django app에서 문제를 해결하기가 어려웠다는 것을 나는 믿을 수 없다. 나는 뭔가를 놓친 것 같아요. 어떤 아이디어?

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

을하고도 다시 게시에 값을 덮어 쓰지 확인하십시오

+0

가에 대한 답변에서보세요 [ "장고 형태에서, 어떻게 필드를 읽기 전용으로 만들기 위해 : 여전히 필수 필드에 문제가있는 경우

또한, 당신은 당신의 modelform에서 다음을 수행 할 수 있습니다 (또는 비활성화 됨) 편집 할 수 없습니까? "(http://stackoverflow.com/questions/324477/in-a-django-form-how-to-make-a-field-readonly-or-disabled- 그렇게 될 수는 없습니다) 저는 여러분이 문제를 해결할 수 있다고 생각합니다. –

+0

감사합니다. 나는 전에 그것을 보았고 제대로 작동하지 못했습니다. 최종 허들 인 것처럼 보이는 "required = False"를 추가하는 것에 대해서는 아래의 내 의견을 참조하십시오. – jamida

답변

6

당신은 수행해야합니다.

studentID = forms.CharField(label="A label", help_text="Student ID", required=False) 
+1

그 트릭을 했어! 보기 흉하지만 작동 할 수 있습니다. 이것은 어쨌든 프로토 타입입니다. 나는 한 가지에 놀랐다. 나는 이것이 필수적으로 모델 레벨에서 필수 필드 임에도 불구하고 "required = False"를 추가해야했습니다. StudentId 필드가 POST 응답으로 되돌려 보내지지 않고 사용자 정의 된 클린 루틴 (myclean routine) 전에 "required = False"문 형식 유효성 검증을하지 않아도됩니다. 하지만 분명히 "required = false"를 사용하면 내 Clean 루틴이 적절한 studentId 정보를 실행하고 재설정 할 수 있습니다. – jamida

+0

사실 작은 문제가 남아 있습니다. "readonly 필드"를 반환 할 때 양식을 제출 한 후 비어 있습니다. 그것은 아마도 수정 된 clean() 때문에 여전히 작동하지만 어색합니다. 이견있는 사람? – jamida

+0

아마도 검색된 모델에서 양식 값을 다시 채울 수 있습니까? –