Python Django:如何使内联模型表单集中的字段在默认情况下不可编辑?

Python Django:如何使内联模型表单集中的字段在默认情况下不可编辑?,python,django,django-forms,Python,Django,Django Forms,我有一个内联模型表单集,如果加载页面时这些字段已经有值,我想使这些字段不可编辑。如果用户单击该行上的“编辑”按钮,它将变得可编辑,并且(使用JavaScript)我将用可编辑的小部件替换原始小部件。加载页面时,我希望执行以下操作: for field in form.fields: if field.value: # display as text else: # display as my standard editable widget for

我有一个内联模型表单集,如果加载页面时这些字段已经有值,我想使这些字段不可编辑。如果用户单击该行上的“编辑”按钮,它将变得可编辑,并且(使用JavaScript)我将用可编辑的小部件替换原始小部件。加载页面时,我希望执行以下操作:

for field in form.fields:
    if field.value:
        # display as text
    else:
        # display as my standard editable widget for this field

我看到
inlineformset\u factory
有一个名为
formfield\u callback
的参数。我怀疑这可能有用,但我还没有找到任何文档。有没有人能为我提供一些有用的文档,以及它如何帮助我解决这个问题?

我认为您可能能够覆盖表单集中使用的表单的init函数。在那里,您可以检查初始_数据,并像您希望的那样动态构建表单。至少,这在我的脑海中听起来似乎是合理的。

我有一个问题,我想去哪里“,如果能找到一个动态创建表单的解决方案,它可能会有帮助:

它不干净,可能有更好的方法来处理


从django以可编辑(普通表单集)的形式发送数据,并使用javascript进行值检查,使用javascript切换小部件,怎么样?

这一点也让我有些困惑。希望这就是你想要的

<TABLE>
    <form method="post" action=".">
        {{ formset.management_form }}
        {% for form in formset.forms %}
            {{ form.id }}
            <tr>
                <td>{{ form.FirstName }}</td> <!-- This is a normal, editable field -->
                <td>{{ form.instance.LastName }}</td> <!-- 'instance' is your actual Django model. LastName displays the text from the last name field -->
            </tr>
        {% endfor %}
    </form>
</TABLE>

{{formset.management_form}
{formset.forms%%中表单的%
{{form.id}
{{form.FirstName}
{{form.instance.LastName}
{%endfor%}

此线程有点旧,但对于任何人来说:

形式如下:

myfield=forms.CharField( widget=forms.TextInput(attrs={'class':'disabled', 'readonly':'readonly'}))
“readonly”是一个HTML属性,它使表单不可编辑。 “disabled”是一个CSS类,因为您需要修改默认样式,而且它使jQuery更简单

要使只读输入在单击时可编辑,下面是一个jQuery示例:

$('input.disabled').click(function(){
    $(this).removeAttr('readonly').removeClass('disabled');
});

form.instance.LastName将显示值,form.initial.LastName将显示主键。

好的,我需要检查实例对象,而不是初始数据,但我明白您的意思。问题是,我该怎么做呢?如何从ModelForm的init方法中修改字段小部件?是的,使用JavaScript是我的退路。不过,如果我可以在服务器上按照自己的需要构造表单,我不希望这样做。我应该能够做到这一点;这只是欺骗django允许我进行这种定制的问题。对我来说,调用
form.initial.LastName
就可以了。这可能是一个安全问题。使用浏览器中的开发人员工具删除“禁用”属性,然后该字段突然可编辑。您必须确保后端也知道它应该忽略对字段的更改。