繁体   English   中英

如何在Django Model Formset上设置额外字段的初始值

[英]How do I set initial values for extra fields on a Django Model Formset

鉴于以下型号:

class ParentModel(models.Model):
    name = models.CharField(max_length=255)

class ChildModel(models.Model):
    name = models.CharField(max_length=255)
    weight = models.FloatField()
    parent = models.ForeignKey("ParentModel")

以下ModelForm为ChildModel提供了一些额外的字段:

class ChildBalancingForm(forms.ModelForm):
    min_weight = forms.FloatField(min_value=0.0, max_value=1.0, required=True, label="Min Weight")
    max_weight = forms.FloatField(min_value=0.0, max_value=1.0, required=True, label="Max Weight")
    class Meta:
        model = ChildModel
        fields = []

我有一个有很多孩子的父模型。 我需要使用一些数学来平衡孩子的体重(每个孩子的最小和最大体重的某些界限)。 所以,我正在尝试创建一个formset,允许用户输入每个孩子的最小和最大权重,以便进行重新平衡。 我想指定一个默认的最小重量,以及所述表格中的默认最大重量。 因此,我在以下观点中有以下内容:

# code to load up the parent whose children are being rebalanced..
# code to set a value for default_min_weight and default_max_weight
# code to get the number of children of said parent, num_children

initial_data = [{"min_weight": default_min_weight, "max_weight": default_max_weight},] * num_children
BalancingFormSet = modelformset_factory(ChildModel, form=ChildBalancingForm, extra=0, can_delete=False, min_num=num_children, max_num=num_children)
formset = BalancingFormSet(queryset=parent.childmodel_set.all(), initial=initial_data)

但是,当我输出表单时,我没有显示为min_weight和max_weight指定的默认值(字段只是空的)。 在formset中为这些额外字段指定初始值的正确方法是什么?

这里的问题是ModelFormSet重新定义了要应用于额外表单的initial参数。 然而,source-diving显示我们可以用不同的名称重新添加它:

# code to load up the parent whose children are being rebalanced..
# code to set a value for default_min_weight and default_max_weight
# code to get the number of children of said parent, num_children

initial_data = [{"min_weight": default_min_weight, "max_weight": default_max_weight},] * num_children

BalancingFormSetBase = modelformset_factory(ChildModel, form=ChildBalancingForm, extra=0, can_delete=False, min_num=num_children, max_num=num_children)

class BalancingFormSet(BalancingFormSetBase):
    def __init__(self, *args, **kwargs):
        initial_forms_initial = kwargs.pop("initial_forms_initial", None)
        super(BalancingFormSet, self).__init__(*args, **kwargs)
        if not initial_forms_initial is None:
            self.initial = initial_forms_initial

formset = BalancingFormSet(queryset=parent.childmodel_set.all(), initial_forms_initial=initial_data)

我(sloppily)测试了Django 1.8上的等效代码,并且它没有干扰实例属性 - 我没有检查如果你有extra设置为非0东西会发生什么。

从1.9开始,覆盖新的get_form_kwargs方法可能会更加健壮,因为它不会假设我们可以覆盖initial属性而不会产生不必要的后果。

当然,如果您不止一次拥有此模式,将__init__定义放入基类或混合中可能是有意义的 - 但是,为了清晰和简单,我不是在这里做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM