【问题标题】:Django – Disabling ModelForm fieldsDjango – 禁用 ModelForm 字段
【发布时间】:2021-01-22 05:35:12
【问题描述】:

如何禁用某些 ModelForm 字段以指示它们不可编辑? docs 似乎建议将小部件设置为 disabled 应该可以解决问题,包括使其具有防篡改功能,但是由于禁用字段 POST 为空,因此表单验证失败。 (也尝试使用 has_changed 方法,但似乎不适用于 ModelForms 并且没有提供等效项......)

我也尝试在 ModelForm 级别设置 clean_<fieldname> 方法,将字段设置为引用实例的值,但在达到之前验证失败。

一些示例代码:

# forms.py
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
            'slug': forms.TextInput(attrs={
                'disabled': True
            })
        }


# views.py
def edit_mymodel(request, slug: str=None):
    instance = get_object_or_404(MyModel, slug=slug)
    form_myform = MyForm(request.POST or None, instance=instance)

    if request.method == 'POST':
        if form_myform.is_valid():
            # fails, because slug is empty in POST request
            pass

【问题讨论】:

    标签: django django-forms


    【解决方案1】:
        widgets = {
                'slug': forms.TextInput(attrs={
                    'readonly': True
                })
            }
    

    disabled 将使输入不可编辑,但将作为其他字段工作,在这种情况下使用 readonly

    【讨论】:

    • 有效。但为什么呢?
    • 因为只读字段不会在 html 验证中检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2010-10-05
    • 2011-08-08
    相关资源
    最近更新 更多