【问题标题】:Django forms - create a form for each object in model, and then save to the corresponding PKdjango forms - 为model中的每个对象创建一个form,然后保存到对应的PK
【发布时间】:2021-01-09 19:43:42
【问题描述】:

我是 django 的新手(以及一般的编程)。对不起,如果我使用了错误的词汇(请纠正我)。这就是我想要做的:

我有这个模型:

Class A(models.Model):
    name = models.CharField(max_length=100, null=True, default='John')

    first_number = models.FloatField(blank=True, default=1)

    second_number = models.FloatField(blank=True, default=2)

    third_number = models.FloatField(blank=True, default=3)

我有这个表格:

class Numbers(ModelForm):
    class Meta:
        model = A

        fields = ['first_number', 'second_number']

在我的模板中,我为 a 中的 x 创建了一个 for(假设 'a' 是 A.objects.all()):

{% for x in a %}
{{form}}
{% endfor %}

但是,当我提交表单时,我无法获得相应的数字。对于我创建的两个对象,我只保存我在“first_number”和“second_number”中输入的最后一个数字。

如何保存正确的值?

【问题讨论】:

  • 您可以尝试将 {{form}} 更正为 {{form.as_p}}

标签: django django-forms django-views django-queryset


【解决方案1】:

当您在循环中呈现这样的表单时,您会在页面代码中获得许多相同的表单,其中包含许多具有相同“名称”属性的输入。如果您将循环包含在单个标签中,您的 POST 请求将始终发送在表单中为每个字段名称找到的最后一个值。

<form>
    <input name="first_number" value="1">
    <input name="first_number" value="2">
    <input name="first_number" value="3">
</form>

POST dict 将包含 {"first_number": "3"}

这将呈现您的每个表单,但您一次只能提交一个:

{% for x in a %}
    <form>
         {{form}}
    </form>
{% endfor %}

如果您想处理相同的数据并将其作为列表发送,您需要在表单实例中使用“前缀”arg:

a = [Numbers(instance=x, prefix=str(x.pk)) for x in A.objects.all()]

#and then in a view
a = [Numbers(request.POST, instance=x, prefix=str(x.pk)) 
     for x in A.objects.all()]

if all([f.is_valid() for f in a]):
    for f in a:
        f.save(commit=True)

这是一个稍微原始的例子。在现实生活中,您可能希望在表单中添加一些隐藏字段,以将 id 列表(可能是 json)传递给表单,然后迭代它而不是数据库中的所有实例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 2023-03-31
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2020-02-15
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多