我正在写一个测试应用程序的问题,以验证某些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