在Django表格中,我如何使一个字段只读(或禁用),以便它无法编辑?
在Django表格中,我如何使一个字段只读(或禁用),以便它无法编辑?
在Django表单中,如何将字段设置为只读或禁用状态?
在使用表单创建新条目时,所有字段都应该可用。但是,在记录更新模式下,一些字段需要设置为只读。
例如,在创建新的Item
模型时,所有字段必须可编辑。但是,当更新记录时,有没有一种方式可以禁用sku
字段,使其可见但无法编辑?
class Item(models.Model): sku = models.CharField(max_length=50) description = models.CharField(max_length=200) added_by = models.ForeignKey(User) class ItemForm(ModelForm): class Meta: model = Item exclude = ('added_by') def new_item_view(request): if request.method == 'POST': form = ItemForm(request.POST) # Validate and save else: form = ItemForm() # Render the view
可以重用ItemForm
类吗?在ItemForm
或Item
模型类中需要做哪些更改?是否需要编写另一个类来更新项目,例如\"ItemUpdateForm
\"?
def update_item_view(request): if request.method == 'POST': form = ItemUpdateForm(request.POST) # Validate and save else: form = ItemUpdateForm()
Django 1.9添加了Field.disabled属性:https://docs.djangoproject.com/en/stable/ref/forms/fields/#disabled
当disabled布尔参数设置为True时,将使用禁用的HTML属性禁用表单字段,使其不可被用户编辑。即使用户篡改提交到服务器的字段值,也会被忽略并使用表单初始数据中的值。
如这个答案所述,Django 1.9添加了Field.disabled属性:
当disabled布尔变量设置为True时,该表单字段将使用disabled HTML属性来禁用它,以便用户不能编辑。 即使用户篡改了提交给服务器的字段值,也会忽略其值,取而代之的是表单初始数据。
在Django 1.8及更早版本中,为了禁用小部件并防止恶意POST攻击,除了在表单字段上设置readonly
属性外,还必须清除输入:
class ItemForm(ModelForm): def __init__(self, *args, **kwargs): super(ItemForm, self).__init__(*args, **kwargs) instance = getattr(self, 'instance', None) if instance and instance.pk: self.fields['sku'].widget.attrs['readonly'] = True def clean_sku(self): instance = getattr(self, 'instance', None) if instance and instance.pk: return instance.sku else: return self.cleaned_data['sku']
或者,将if instance and instance.pk
替换为另一个表示正在编辑的条件。您还可以在输入字段上设置disabled
属性,而不是readonly
属性。
clean_sku
函数将确保readonly
值不会被POST
覆盖。
否则,没有内置的Django表单字段会渲染值,同时拒绝绑定输入数据。如果您想要这个,您应该创建一个不包括不可编辑字段的单独的ModelForm
,并在模板中打印它们。