[英]Using modelformset_factory and access attributes of an object
我有一些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
以显示要修改的框。
这很好用,我可以编辑每个Box
的属性a
, b
和c
。 但是每个盒子上也有一个label
。 我想访问该值以在标签中显示它,但它不应像input
-field一样可编辑。 我只需要价值。 我该如何实现?
您可以将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 %}
我建议指定一个用于模型的表单,在该表单中,您可以设置任何要只读的属性。
#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);
就个人而言,我希望第一个
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.