【问题标题】:Page with forms for multiple foreign keys带有多个外键表单的页面
【发布时间】:2020-03-25 19:55:29
【问题描述】:

给定以下(简化的)模型:

class Person(models.Model):
    name = models.CharField(max_length=64)


class Weight(models.Model):
    person = models.ForeignKey(Person, verbose_name="Person")
    date = models.DateField("Date")
    weight = models.DecimalField("Weight", max_digits=4, decimal_places=1)

我正在寻找一种方法来一次为特定组的人添加体重信息,我通过例如获取参数。 Persons 列表的长度和列表中的 Persons 可以变化。

所以我希望生成一个类似的页面:

Person 1     Date: <pick date>     Weight: <enter weight>
Person 2     Date: <pick date>     Weight: <enter weight>
Person 3     Date: <pick date>     Weight: <enter weight>
Person 4     Date: <pick date>     Weight: <enter weight>
Person 5     Date: <pick date>     Weight: <enter weight>

<Save>

这将保存体重信息 5 次,每个(不同的)人一次。

我查看了formsets 和相关文档,但看起来这些更适用于相同的项目并且可以即时生成更多(例如,在一位作者名下创建多本书)。在我的例子中,每个权重都绑定到某个人,但是这个人在表格中的每一行都不同。 我认为表单集上的prefix 选项(在一个页面上使用不同的表单集)在这里可能会有所帮助,但是查看文档我不确定。

Django 做这些事情的方式是什么?

关于 SO 的其他问题引用 to similar topics 似乎与我的用例不符,除非我忽略了某些东西。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以使用 formset 并为每个表单中的 person 字段赋予初始值:

    forms.py

    class WeightForm(forms.ModelForm):
        class Meta:
            model = Weight
            fields = '__all__'
    

    views.py

    persons = Persons.objects.all()
    data = request.POST or None
    
    WeightFormSet = formset_factory(form=WeightForm, extra=0)
    formset = WeightFormSet(data=data, initial=[{'person': p} for p in persons])
    
    if request.method == 'POST':
         ...
    

    【讨论】:

    • 谢谢,initial=[{'person': p} for p in persons] 确实是个问题!可以通过form.initial.person(或当页面因错误重新加载时form.instance.person)访问此人的姓名。
    猜你喜欢
    • 2015-05-24
    • 2012-12-15
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多