[英]Django: How to set initial values for a field in an inline 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.