使用modelformset_factory和访问对象的属性

时间:2017-11-25 17:21:42

标签: python django django-forms django-templates python-3.6

我有一些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以显示我想要修改的框。

这非常有效,我可以修改每个a的属性bcBox。但每个方框也有一个label。我想访问该值以在标签中显示它,但它不应该是可编辑的,如input - 字段。我只需要价值。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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 %}

答案 1 :(得分: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);

就个人而言,我更喜欢第一个