[英]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.