일부 장고 기능을 확인하기 위해 작성중인 테스트 앱에 문제가 있습니다. 테스트 응용 프로그램은 현재 Alex Gaynor의 읽기 전용 필드 기능을 사용하는 작은 "성적 북"응용 프로그램입니다. http://lazypython.blogspot.com/2008/12/building-read-only-field-in-django.htmlDjango 양식 (읽기 전용 입력란/위젯)에서 이상한 동작
관련된 두 가지 문제점이 있습니다. 첫째, 아래 2 줄의 설명을 덧붙일 때 :
# myform = GradeForm(data=request.POST, instance=mygrade)
myform = GradeROForm(data=request.POST, instance=mygrade)
학생용 입력란이 변경 될 수 있다는 것을 제외하고는 예상대로 작동합니다.
의견이 표시된 경우 "studentId"필드는 숫자 (이름, 문제 1 아님)로 표시되며 제출을 누르면 studentId가 Student 인스턴스 여야한다는 오류가 표시됩니다.
이 문제를 해결하는 방법에 관해서는 분실했습니다. 알렉스 게이너의 코드에 집착하지 않아. 모든 코드가 작동합니다. 필자는 Python과 Django에 비교적 익숙하기 때문에 "읽기 전용 영역을 만드는 것이 쉽다"라는 웹 사이트에서 본 힌트는 여전히 저를 초월합니다.
// 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)
# testbed.grades.readonly is alex gaynor's code
from testbed.grades.readonly import ReadOnlyField
class GradeROForm(ModelForm):
studentId = ReadOnlyField()
class Meta:
model=Grade
class GradeForm(ModelForm):
class Meta:
model=Grade
// views.py
def modifyGrade(request,student):
student = Student.objects.get(name=student)
mygrade = Grade.objects.get(studentId=student)
if request.method == "POST":
# myform = GradeForm(data=request.POST, instance=mygrade)
myform = GradeROForm(data=request.POST, instance=mygrade)
if myform.is_valid():
grade = myform.save()
info = "successfully updated %s" % grade.studentId
else:
# myform=GradeForm(instance=mygrade)
myform=GradeROForm(instance=mygrade)
return render_to_response('grades/modifyGrade.html',locals())
// 템플릿
<p>{{ info }}</p>
<form method="POST" action="">
<table>
{{ myform.as_table }}
</table>
<input type="submit" value="Submit">
</form>
// 알렉스 게이너의 코드
from django import forms
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.forms.util import flatatt
class ReadOnlyWidget(forms.Widget):
def render(self, name, value, attrs):
final_attrs = self.build_attrs(attrs, name=name)
if hasattr(self, 'initial'):
value = self.initial
return mark_safe("<span %s>%s</span>" % (flatatt(final_attrs), escape(value) or ''))
def _has_changed(self, initial, data):
return False
class ReadOnlyField(forms.FileField):
widget = ReadOnlyWidget
def __init__(self, widget=None, label=None, initial=None, help_text=None):
forms.Field.__init__(self, label=label, initial=initial,
help_text=help_text, widget=widget)
def clean(self, value, initial):
self.widget.initial = initial
return initial
내 코드는 결국 userlogin 페이지 뒤에 있지만 관리자 시스템의 모든 기능을 사용하는 데는 관심이 없습니다. ModelAdmin은 일반적인 Admin 프레임 워크 외부에서 사용할 수 있습니까? 어쨌든, 나는 적어도 장고의 코드를보고 알렉스의 코드를 내 목적대로 "업데이트"할 수 있는지 알아볼 것입니다. – jamida