2017-09-18 83 views
0

我在Django中有一個內聯表單集。我想知道如何根據實例參數爲此表單中的表單設置max_value。問題是,當我們通過使用inlineformset_factory創建一個formset時,我們沒有傳入窗體的實例,而是傳遞類,所以我不知道如何傳遞參數。如何在創建formset期間將參數傳遞給表單

當表單被啓動時,已經有一個可用的kwargs對象被傳遞。但由於一些奇怪的原因,當我嘗試設置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

你可以使用functools創建您的Form類的咖喱版本:

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中重寫整個字段即可。 –

相關問題