2017-11-25 116 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); 

个人只读,我宁愿第一