如何实现带有嵌套字段的表单?

时间:2019-07-24 10:00:29

标签: python django django-models django-forms django-templates

有两个相关模型

class Skill(models.Model):
    """Information about an employee's skills."""

    LEVELS = (
        ('basic', 'Basic'),
        ('intermediate', 'Intermediate'),
        ('advanced', 'Advanced'),
        ('expert', 'Expert'),
    )

    employee = models.ForeignKey(
        Employee, on_delete=models.CASCADE, related_name="employee_skills")
    technology = models.ForeignKey(Technology, on_delete=models.CASCADE)
    year = models.CharField('common year using amount ', max_length=4)
    last_year = models.CharField('Last year of technology using ', max_length=4)
    level = models.CharField("experience level", max_length=64, choices=LEVELS)

class Technology(models.Model):
    """Technologies."""

    name = models.CharField('technology name', max_length=32, unique=True)
    group = models.ForeignKey(Techgroup, on_delete=models.CASCADE, related_name="group")

重点是,每种技术对于所有权级别,多年经验以及上一次使用的时间都有自己的含义。 我制作了一张表格,可以一次编辑一种技术。

forms.py

class SkillEditForm(forms.ModelForm):
    YEAR_CHOICES = [(r, r) for r in range(1, 11)]
    LAST_YEAR_CHOICES = [(r, r) for r in range(1980, datetime.datetime.now().year + 1)]
    year = forms.CharField(
        widget=forms.Select(choices=YEAR_CHOICES),
    )
    last_year = forms.CharField(widget=forms.Select(choices=LAST_YEAR_CHOICES))

    class Meta:

        model = Skill
        fields = ['technology', 'level', 'last_year', 'year']

数据库中有数十种技术。现在,我想实现一次在一个窗口中编辑所有技术的功能,以便用户不必按按钮即可添加技术10次。

类似:

technology1   level last_year  year
......
......
technology_N   level last_year  year

<button>

这就是我坚持如何实现它的地方。我将很感谢您的建议。

1 个答案:

答案 0 :(得分:1)

要在单个视图中编辑多个模型,您将必须基于这些模型渲染和处理多个ModelForm。
在多个模型实例上进行创建/更新操作的常见解决方案是django's formsets
我建议您使用inline formsetsinlineformset_factory,因为它确实使事情变得容易得多。
不要忘记在模板中包含management form,因为在处理表单集时会造成很多麻烦。

如果您不想编写过多的JavaScript,则在django-dynamic-formset之类的事情的前端可以完成这项工作。