2017-11-25 163 views
0

我有一些Container s,並且他們有一些Box es我想編輯。自然,我使用modelformset_factory使用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,bc。但每個盒子也有一個label。我想訪問該值以將其顯示在標籤中,但不應該是可編輯的,如input -field。我只需要價值。我怎樣才能做到這一點?

+0

我想只有價值。不是TextInput-widget或自動渲染的東西。 – tjati

+0

查看我的更新回答。只需訪問該值非常簡單:'form.instance'爲您提供每個表單的模型實例。 – schwobaseggl

回答

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 %} 
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); 

個人只讀,我寧願第一