在Django表单中,如何使字段只读(或禁用)
当表单用于创建新条目时,应启用所有字段-但当记录处于更新模式时,某些字段需要为只读
例如,创建新的项目模型时,所有字段都必须可编辑,但在更新记录时,是否有方法禁用sku字段,使其可见,但无法编辑
类项目(models.Model):
sku=models.CharField(最大长度=50)
description=models.CharField(最大长度=200)
添加了\u by=models.ForeignKey(用户)
类ItemForm(ModelForm):
类元:
型号=项目
排除=('added_by')
def新项目视图(请求):
如果request.method==“POST”:
form=ItemForm(request.POST)
#验证并保存
其他:
form=ItemForm()
#渲染视图
类ItemForm是否可以重用?ItemForm或Item模型类中需要进行哪些更改?是否需要编写另一个类“ItemUpdateForm”,以更新该项
def更新项目视图(请求):
如果request.method==“POST”:
form=ItemUpdateForm(request.POST)
#验证并保存
其他:
form=ItemUpdateForm()
正如回答中指出的,Django 1.9添加了Field.disabled属性:
禁用的布尔参数设置为True时,将使用禁用的HTML属性禁用表单字段,以便用户无法对其进行编辑。即使用户篡改了提交给服务器的字段值,它也会被忽略,取而代之的是表单初始数据中的值
对于Django 1.8及更早版本,要禁用小部件上的条目并防止恶意的POST攻击,除了在表单字段上设置readonly属性外,还必须清除输入:
类项目表单(ModelForm):
定义初始化(self,*args,**kwargs):
super(ItemForm,self)。\uuuuu init\uuuu(*args,**kwargs)
instance=getattr(self,'instance',None)
如果instance和instance.pk:
self.fields['sku'].widget.attrs['readonly']=True
def清洁sku(自身):
instance=getattr(self,'instance',None)
如果instance和instance.pk:
return instance.sku
其他:
返回自清理的_数据['sku']
或者,将instance和instance.pk中的替换为另一个指示您正在编辑的条件。您还可以在输入字段上设置属性disabled,而不是readonly
clean_sku功能将确保readonly值不会被POST覆盖
否则,没有内置的Django表单字段,它将在拒绝绑定输入数据的同时呈现值。如果这是您想要的,您应该创建一个单独的ModelForm,排除不可编辑的字段,并在模板中打印它们