当前位置: 首页 > 知识库问答 >
问题:

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

太叔灿
2023-03-14

给定以下模型:

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")

以及以下模型窗体,其中包含一些用于儿童模型的额外字段:

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

我有一个有很多孩子的父母模型。我需要使用一些数学来平衡孩子们的体重(每个孩子的最小和最大体重都有一些限制)。因此,我试图创建一个表单集,允许用户输入每个孩子的最小和最大体重,以提交重新平衡。我想在上述表格中指定一个默认的最小重量和一个默认的最大重量。因此,我的观点如下:

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

共有1个答案

阚夕
2023-03-14

这里的问题是< code>ModelFormSet重新定义了< code>initial参数以应用于额外的表单。然而,源潜水揭示,我们可以只是重新添加在一个不同的名字:

# 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上测试了等效代码,它没有干扰实例属性 - 我没有检查如果你将额外设置为非0的东西会发生什么。

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

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

 类似资料:
  • 问题内容: 我必须在模型表格中添加额外的字段。我的方法是: 但似乎忽略了at的小部件定义,因为我在模板上没有 输入 标签,而是使用了 textarea 。所以我采用下一种方法: 它非常适合我,但是我曾经在声明时为表单字段指定小部件。所以我想知道: 为什么我的第一种方法不起作用?我做错了什么? 问题答案: 多余的字段无关紧要。这有效: 这不是: 确实没有记录,这是我在与该行为有关的文档中可以找到的最

  • Django 1.6 我在Django表单类中有一个工作代码块,如下所示。我用来构建表单字段列表的数据集可以包含任何字段的初始值,而我在表单中设置该初始值时没有成功。块,下面的块确实填充了初始表单字典属性,但未显示初始值。请注意(如果您想知道) 属性在 调用之前不存在。 这能做到吗? 如果是这样的话,我在做什么不正确的事情? 谢啦!

  • 我有一个表单,其中的字段来自ModelForm,其中一个是Models.ForeignKey字段,它链接到我的用户模型中的用户名。这将导致数据库中的每个用户都列在选择字段中。我希望这个字段是一个文本输入,在这里有人输入一个用户名,我在ModelForm中已经这样做了。但是当我的视图经过form.is_valid()时,表单给出一个错误,表示此字段无效。如果我删除is_valid()检查,它当然会给

  • 问题内容: 我有一个像这样的模型: 我想迁移并同时托管这两个主机是主键。 问题答案: 我将以稍微不同的方式来实现。 我将使用默认的主键(自动字段),并使用meta class属性, 它将充当“代理”主键列。 如果您确实要创建多列主键,请查看此应用

  • 本文向大家介绍django 模型字段设置默认值代码,包括了django 模型字段设置默认值代码的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 补充知识:django 设置默认值到SQL 环境:django 1.9.7 背景介绍 django migrate 生成表结构时,默认是不处理default(即字段的default 是在django 框架层面,没有到数据库

  • 问题内容: 我有一个领域模型: 在我的管理员中: 在这里,我不想在添加MyModel时在管理员中使用。我希望将其设置为当前用户,例如 我怎样才能做到这一点? 谢谢 问题答案: 您已经设置好了,因此它不会以Django管理员的形式出现。 现在,您需要覆盖,并在保存新对象之前设置用户。