我正在实施简单的“成绩簿”应用程序,其中教师可以更新成绩而不允许更改学生的姓名(至少不会更新年级页面)。为此,我使用了最简单的只读技巧之一。问题是,在SUBMIT后,视图重新显示为学生的'空白'值。我希望学生的名字重新出现。CharField值在保存后消失(只读字段)
下面是展示此问题的最简单示例。 (这是穷人DB设计,我知道,我刚提取的代码,展示问题的相关部分,在实际的例子,学生是在自己的表,但问题仍然存在那里。)
models.py
class Grade1(models.Model):
student = models.CharField(max_length=50, unique=True)
finalGrade = models.CharField(max_length=3)
class Grade1OForm(ModelForm):
student = forms.CharField(max_length=50, required=False)
def __init__(self, *args, **kwargs):
super(Grade1OForm,self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance and instance.id:
self.fields['student'].widget.attrs['readonly'] = True
self.fields['student'].widget.attrs['disabled'] = 'disabled'
def clean_student(self):
instance = getattr(self,'instance',None)
if instance:
return instance.student
else:
return self.cleaned_data.get('student',None)
class Meta:
model=Grade1
views.py
from django.forms.models import modelformset_factory
def modifyAllGrades1(request):
gradeFormSetFactory = modelformset_factory(Grade1, form=Grade1OForm, extra=0)
studentQueryset = Grade1.objects.all()
if request.method=='POST':
myGradeFormSet = gradeFormSetFactory(request.POST, queryset=studentQueryset)
if myGradeFormSet.is_valid():
myGradeFormSet.save()
info = "successfully modified"
else:
myGradeFormSet = gradeFormSetFactory(queryset=studentQueryset)
return render_to_response('grades/modifyAllGrades.html',locals())
模板
<p>{{ info }}</p>
<form method="POST" action="">
<table>
{{ myGradeFormSet.management_form }}
{% for myform in myGradeFormSet.forms %}
{# myform.as_table #}
<tr>
{% for field in myform %}
<td> {{ field }} {{ field.errors }} </td>
{% endfor %}
</tr>
{% endfor %}
</table>
<input type="submit" value="Submit">
</form>
谢谢Lakshman,但我还是Django的新手。我如何设置原始值?我试图把它叫做:student = forms.CharField(max_length = 50,widget = ReadOnlyWidget())但这不对,因为我需要传入一个原始值。注意...我最终的目标是在模型表单中使用它。 – jamida 2010-05-31 21:21:05
jamida:传递给ReadOnlyWidget,一个学生实例,您想要在窗体上只读显示。 – 2010-05-31 21:46:06
如何在modelformset中做到这一点?我是否在上面的代码示例或表单的__init__例程中执行此操作? (或者?)并且如果init例程,我该如何引用该init例程中的小部件?注意。我很乐意阅读文档,但深入django并没有很好的文档。如果你有链接,那会很棒! – jamida 2010-05-31 22:09:18