我有一些Container
,他们有一些Box
我要编辑的内容。所以,我自然会使用modelformset_factory。
效果非常好:
container = get_object_or_404(Container, id=container_id)
BoxFormSet = modelformset_factory(Box, fields=('a', 'b', 'c'))
formset = BoxFormSet(queryset=container.box_set.all())
在我的模板中,我遍历formset
以显示我想要修改的框。
这非常有效,我可以修改每个a
的属性b
,c
和Box
。但每个方框也有一个label
。我想访问该值以在标签中显示它,但它不应该是可编辑的,如input
- 字段。我只需要价值。我怎样才能做到这一点?
答案 0 :(得分:1)
您可以将widgets
参数传递给工厂。在那里,您可以为标签输入指定适当的属性:
BoxFormSet = modelformset_factory(
Box,
fields=('a', 'b', 'c', 'label'),
widgets={'label': forms.TextInput(attrs={'readonly': True})}
)
或者,如果您不想要自动呈现但已禁用的输入,则只需通过表单的实例访问模板中的标签:
{% for form in box_formset %}
# form stuff
{{ form.instance.label }}
{% endfor %}
答案 1 :(得分:0)
我建议指定一个用于模型的表单,在该表单中,您可以设置您想要只读的任何属性。
#forms.py
class BoxForm(forms.ModelForm):
class Meta:
model = Box
fields=('a', 'b', 'c', 'label')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.id:
self.fields['label'].widget.attrs['readonly'] = True
#views.py
BoxFormSet = modelformset_factory(Box, form=BoxForm)
另一种方法是使用javascript将这些字段设置为只读
$('input[name="label"]').attr('readonly', true);
就个人而言,我更喜欢第一个