gpt4 book ai didi

django - django 中的强制只读字段

转载 作者:行者123 更新时间:2023-12-01 11:08:23 25 4
gpt4 key购买 nike

我正在编写一个测试“成绩簿”应用程序。 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)

我希望能够更改模型集中多个学生的最终成绩,但现在我一次只尝试更改一个学生。我还试图为它创建一个表单,将学生姓名显示为一个无法更改的字段,这里唯一可以更改的是 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())

这显示了我期望的表单,但是当我点击“提交”时,我收到学生字段的表单验证错误,告诉我这个字段是必需的。我猜想,由于该字段被“禁用”,POST 中未报告该值,并且由于我不知道的原因,该实例未在其位置使用。

我是一名新的 Django/Python 程序员,但在其他语言方面经验丰富。我不敢相信我在我的第一个重要的 Django 应用程序中偶然发现了如此难以解决的问题。我想我一定是遗漏了什么。有什么想法吗?

最佳答案

你应该执行:

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

并确保不要覆盖回发时的值。

此外,如果必填字段仍然有问题,您可以在您的模型表单中执行以下操作:

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

关于django - django 中的强制只读字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com