【问题标题】:how to pass the parameter to a form during formset creation如何在表单集创建期间将参数传递给表单
【发布时间】:2018-02-26 18:11:38
【问题描述】:

我在 Django 中有一个内联表单集。而且我想知道如何根据实例参数为该表单集中的表单设置一些max_value。问题是当我们使用inlineformset_factory创建表单集时,我们传递的不是表单的实例,而是类,所以我不知道如何在那里传递参数。

当表单启动时,已经有一个instance 对象在传递的 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)

【问题讨论】:

    标签: django django-forms formset inline-formset otree


    【解决方案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,
                               )
    

    【讨论】:

    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多