Django modelform字段如何使禁用和防止篡改?

时间:2018-05-11 16:15:38

标签: django django-forms

有这个禁用的属性。但我无法将其应用于模型表字段。我不知道该怎么做。我可以轻松地将它添加到forms.Form。但由于我使用小部件,我只是不知道在哪里插入它。

https://docs.djangoproject.com/en/2.0/ref/forms/fields/#disabled

class TestForm(forms.ModelForm):
    class Meta:
        model = Test
        fields = ['date']
        widgets = {'date': forms.TextInput(attrs={'readonly': 'readonly'})}

3 个答案:

答案 0 :(得分:1)

class TestForm(forms.ModelForm):
date = forms.CharField(disabled=True)
class Meta:
    model = Test
    fields = ['date']

    widgets = {
        'date': forms.TextInput(attrs={'readonly': 'readonly'}),
    }

答案 1 :(得分:1)

尝试类似这样的事情,假设您的date字段为forms.DateField并且您要使用TextInput小部件:

class TestForm(forms.ModelForm):
    date = forms.DateField(widget=forms.TextInput, disabled=True)
    class Meta:
        model = Test
        fields = ['date']

这将覆盖从Test模型定义创建的默认字段定义。

  

禁用的boolean参数设置为True时,使用禁用的HTML属性禁用表单字段,以便用户无法编辑它。即使用户篡改了提交给服务器的字段值,也会忽略该格式以支持表单初始数据中的值。

了解readonly vs disabled HTML输入属性。

从上述SO帖子中取出的关键注释是:

  

readonly元素不可编辑,但会在相应的form提交时发送。 disabled元素无法编辑,也不会在提交时发送。

从上面引用,设置disabled=True就足够了,因此您无需在窗口小部件上设置readonly属性。

答案 2 :(得分:1)

在创建时我想禁用某些字段时遇到了一种情况。并且某些字段在编辑时被禁用。

我的环境: Python 3,Django 2.1

我的表单:

class AddInvoiceForm(forms.ModelForm):
    disabled_fields = ['inv_type', 'report', 'subsidiary']
    class Meta:
        model = models.Invoice
        fields = ('inv_type', 'report', 'subsidiary', 'rate_card', 'reviewed')

    def __init__(self, *args, **kwargs):
        super(AddInvoiceForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            for field in self.disabled_fields:
                self.fields[field].disabled = True
        else:
            self.fields['reviewed'].disabled = True