簡體   English   中英

使用modelformset_factory和訪問對象的屬性

[英]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的屬性abc 但是每個盒子上也有一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM