gpt4 book ai didi

python - 如何为 Django 模型表单集上的额外字段设置初始值

转载 作者:行者123 更新时间:2023-11-28 19:15:24 25 4
gpt4 key购买 nike

给定以下模型:

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 = []

我有一个有很多 child 的父模型。我需要使用一些数学来平衡 children 的体重(对每个 child 的最小和最大体重有一些限制)。因此,我正在尝试创建一个表单集,允许用户为每个 child 输入最小和最大重量以提交重新平衡。我想在上述表格中指定默认的最小重量和默认的最大重量。因此,我有以下看法:

# 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 指定的默认值没有显示(字段只是空的)。为我的表单集中的这些额外字段指定初始值的正确方法是什么?

最佳答案

这里的问题是 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)

我(草率地)在 Django 1.8 上测试了等效代码,它没有干扰实例属性 - 我没有检查如果你有 extra 会发生什么设置为不是 0 的东西, 不过。

从 1.9 开始,覆盖新的 get_form_kwargs方法可能更健壮,因为它不假设我们可以覆盖 initial没有不良后果的属性。

当然,如果你不止一次遇到这种模式,把这个 __init__ 放在一起可能是有意义的定义到基类或混入中 - 但是,为了清楚和简单起见,我在这里不这样做。

关于python - 如何为 Django 模型表单集上的额外字段设置初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34162080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com