2009-10-14 60 views
4

我有一个内联模型formset,并且我想让字段不可编辑,如果这些字段在页面加载时已经有值。如果用户点击该行上的“编辑”按钮,它将变得可编辑,并且(使用JavaScript),我将用可编辑的替换原始小部件。我想在加载页面时做这样的事情:Django:如何使内联模型formset中的字段默认为不可编辑?

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参数。我怀疑这可能是有用的,但是因为我没有找到任何文档。任何人都可以为我指出一些有用的文档,以及它如何帮助我解决这个问题?

回答

0

我想你可能会重写formset中使用的表单的init函数。在那里你可以检查initial_data,并像你希望的那样动态地构建你的表单。至少,这听起来似乎是合情合理的。

+0

好吧,我需要检查一个实例对象,不是initial_data,但我看到你在说什么。问题是,我从那里做什么?如何修改ModelForm的__init__方法中的字段小部件? – Jeff 2009-10-14 19:46:00

+0

没关系。 self.fields ['fieldname']。widget ... – Jeff 2009-10-14 19:50:47

0

我有我想要的地方“Auto-generate form fields”,可以发现,用于动态创建的形式解决问题,它可以帮助:

Auto-generate form fields for a Form in django

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

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

+0

是的,使用JavaScript是我的后备。尽管如此,如果我可以根据需要在服务器上构建表单,我宁愿不这样做。我应该能够做到这一点;这只是一个让django陷入困境的问题,它允许我进行这种定制。 – Jeff 2009-10-15 17:46:05

12

这一个难倒了我一点。希望这是你要找的。

<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

对我来说,调用'form.initial.LastName'就可以做到。 – 2015-08-17 21:34:27

+1

@Aaron C. de Bruyn,谢谢! – bordeltabernacle 2015-11-03 16:06:37

6

这个线程是有点老了,但任何人都希望:

形式

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'); 
}); 
+0

这可能是一个安全问题。使用浏览器中的开发人员工具删除“禁用”属性,并突然显示该字段是可编辑的。您必须确保后端也知道它应该忽略对该字段的更改。 – 2016-01-28 18:14:42

相关问题