2017-09-18 22 views
0

Djangoにインラインフォームセットがあります。そして、私はどのようにmax_valueインスタンスパラメータに基づいてこのフォームセットにあるフォームを設定することができますか。問題は、inlineformset_factoryを使用してフォームセットを作成するときに、フォームのインスタンスではなくクラスを渡すので、そこでパラメータを渡す方法がわかりません。フォームセット作成時にフォームにパラメータを渡す方法

フォームが開始されるときに、そこに渡されるkwargsで利用可能なオブジェクトが既にあります。instanceしかし、いくつかの奇妙な理由のために、私がmax_valueを設定しようとすると何も起こりません。 今、ウィジェットのmax属性を設定するにはかなり醜い解決策を見つけました。これは動作しますが、正しい方法があるのだろうかと思います。

from .models import SendReceive, Player 

from django.forms import inlineformset_factory, BaseFormSet, BaseInlineFormSet 


class SRForm(forms.ModelForm): 
     amount_sent = forms.IntegerField(label='How much to sent?', 
             required=True, 
             widget=forms.NumberInput(attrs={'min': 0, 'max': 20}) 
             ) 

     def __init__(self, *args, **kwargs): 
      super(SRForm, self).__init__(*args, **kwargs) 
      curmax = kwargs['instance'].sender.participant.vars['herd_size'] 
      self.fields['amount_sent'].widget.attrs['max'] = int(curmax) 

     class Meta: 
      model = SendReceive 
      fields = ['amount_sent'] 


SRFormSet = inlineformset_factory(Player, SendReceive, 
             fk_name='sender', 
             can_delete=False, 
             extra=0, 
             form=SRForm,) 
formset = SRFormSet(self.request.POST, instance=self.player) 

答えて

1

あなたのFormクラスのカリー化バージョンを作成するためにfunctoolsを使用することができます。

from functools import partial, wraps 


# create a curried form class 
form_with_params = wraps(SRForm)(partial(SRForm, your_param='your_value')) 

# use it instead of the original form class 
SRFormSet = inlineformset_factory(
          Player, 
          SendReceive, 
          # ... 
          form=form_with_params, 
          ) 
+0

ありがとうございました! もう少し解決しましたが、あなたのソリューションはもっと普遍的に見えます。 ここで私はそれをしました:https://gist.github.com/chapkovski/b6fd6134124d88d671ed7b3b1baa4b81 それで 'max_value'を書き直すのではなく、initのフィールド全体を書き直すだけで十分でした。 –

関連する問題