Django:如何在内联模型formset中默认使字段不可编辑?

时间:2009-10-14 18:13:20

标签: python django django-forms

我有一个内联模型formset,如果这些字段在加载页面时已经有值,我想使字段不可编辑。如果用户单击该行上的“编辑”按钮,它将变为可编辑状态(使用JavaScript)我将用可编辑的小部件替换原始小部件。我想在加载页面时做类似的事情:

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

我看到inlineformset_factory有一个名为formfield_callback的参数。我怀疑这可能有用,但我没有找到任何文件。任何人都可以为我指出一些有用的文档,以及它如何帮助我解决这个问题?

5 个答案:

答案 0 :(得分:14)

这一点也让我感到难过。希望这是你正在寻找的。

<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>

答案 1 :(得分:6)

这个帖子有点旧,但对于任何看起来的人来说:

形式:

myfield=forms.CharField( widget=forms.TextInput(attrs={'class':'disabled', 'readonly':'readonly'}))

“readonly”是一个HTML属性,使表单不可编辑。 “disabled”是一个CSS类,因为你需要修改默认样式,它也使jQuery更简单。

要使readonly输入在单击时可编辑,这是一个jQuery示例:

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

答案 2 :(得分:0)

我认为您可以覆盖表单集中使用的表单的init函数。在那里你可以检查initial_data,并像你希望的那样动态构建表单。至少,这听起来似乎有道理。

答案 3 :(得分:0)

我有一个问题,我想要“Auto-generate form fields”,可以找到动态创建表单的解决方案,它可能有所帮助:

Auto-generate form fields for a Form in django

它不干净,可能有更好的方法来解决这个问题。

如何从django发送数据为可编辑(普通formset)并使用javascript进行值检查,使用javascript切换小部件?

答案 4 :(得分:0)

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