在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重用类吗?ItemFormItem模型类需要进行哪些更改?我需要编写另一个类“ 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属性:

禁用的布尔参数设置为True时,将使用禁用的HTML属性禁用表单字段,以使用户无法对其进行编辑。即使用户篡改了提交给服务器的字段的值,也将忽略该字段,而使用表单的初始数据中的值。

使用Django 1.8及更早版本,要禁用小部件上的输入并防止恶意POST黑客入侵,除了readonly在form字段上设置属性外,还必须清除输入内容:

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的字段,该字段将不可编辑的字段排除在外,然后将它们打印在模板中。

以上是 在Django表单中,如何将字段设置为只读(或禁用)以便无法对其进行编辑? 的全部内容, 来源链接: utcz.com/qa/435562.html

回到顶部