我正在寫一個測試應用程序的問題,以驗證某些Django功能。該測試應用程序是目前使用Alex Gaynor的只讀字段功能的小型「等級書」應用程序。http://lazypython.blogspot.com/2008/12/building-read-only-field-in-django.htmlDjango窗體中的奇怪行爲(只讀字段/窗口小部件)
有兩個可能相關的問題。首先,當我翻牌下面這兩條線的評論:
# myform = GradeForm(data=request.POST, instance=mygrade)
myform = GradeROForm(data=request.POST, instance=mygrade)
它像我期望的那樣,當然除了學生場是多變的。
當評論是顯示的方式,「studentId」字段顯示爲一個數字(不是名稱,問題1),當我點擊提交時,我得到一個錯誤,說studentId需要是一個學生實例。
我不知道如何解決這個問題。我並不喜歡Alex Gaynor的代碼。任何代碼都可以使用。我對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>
//亞歷克斯Gaynor的代碼
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
雖然我的代碼最終會落在用戶登錄頁面後面,但我還沒有(對?)有興趣使用管理系統的全部功能。 ModelAdmin是否可以在一般管理框架之外使用?無論如何,我至少會在那裏查看django的代碼,看看我是否可以爲我的目的「更新」Alex的代碼。 – jamida 2010-05-28 19:56:26