2017-11-25 9 views
0

私はいくつかのContainerを持っていて、数字はBoxです。編集したいです。ですから当然、私は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を反復。

これは非常にうまく機能し、それぞれBoxa,bcという属性を編集できます。しかし、各ボックスにはlabelもあります。値にアクセスしてラベルに表示したいのですが、input -fieldのように編集することはできません。私は価値が必要なだけです。それをどうすれば実現できますか?

+0

を好むようにそれらのフィールドを設定することです。 TextInputウィジェットや何か自動的にレンダリングするものではありません。 – 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) 

代替は読み取り専用個人的に

$('input[name="label"]').attr('readonly', true); 

javascriptの

を使用して、私は私が欲しいだけの値を持つ最初の

関連する問題