我在Django中有一个内联formset。我想知道如何根据实例参数为此formset中的表单设置一些max_value
。问题是当我们使用inlineformset_factory
创建一个formset时,我们传递的不是表单的实例,而是类,所以我不知道如何在那里传递参数。
当表单启动时,kwargs中已经有一个instance
对象可以在那里传递。但由于一些奇怪的原因,当我试图设置max_value
时没有任何反应。
现在我发现了一个非常难看的解决方案来设置widget 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)
答案 0 :(得分:1)
您可以使用functools
创建Form类的curried版本:
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,
)