【问题标题】:Django: How do I make fields non-editable by default in an inline model formset?Django:如何在默认情况下在内联模型表单集中使字段不可编辑?
【发布时间】:2010-12-06 18:51:44
【问题描述】:

我有一个内联模型表单集,如果在加载页面时这些字段已经具有值,我想使字段不可编辑。如果用户单击该行上的“编辑”按钮,它将变为可编辑的,并且(使用 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 的参数。我怀疑这可能很有用,但是因为我还没有找到任何文档。谁能指出一些有用的文档,以及它如何帮助我解决这个问题?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

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

    【讨论】:

    • 好吧,我需要检查一个实例对象,而不是 initial_data,但我明白你在说什么。问题是,我该怎么做?如何在 ModelForm 的 init 方法中修改字段小部件?
    【解决方案2】:

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

    Auto-generate form fields for a Form in django

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

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

    【讨论】:

    • 是的,使用 JavaScript 是我的后备方案。不过,如果我可以在服务器上构建我想要的表单,我宁愿不这样做。我应该能够做到;这只是让 django 允许我进行这种自定义的问题。
    【解决方案3】:

    这个也让我有点难过。希望这就是您正在寻找的。​​p>

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

    【讨论】:

    • 对我来说,拨打 form.initial.LastName 就可以了。
    【解决方案4】:

    这个帖子有点老了,但对于任何人来说:

    形式:

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

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

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

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

    【讨论】:

    • 这可能是一个安全问题。使用浏览器中的开发人员工具删除“禁用”属性,突然该字段可编辑。您必须确保后端也知道它应该忽略对字段的更改。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2023-02-12
      • 2010-09-30
      相关资源
      最近更新 更多