有两个相关模型
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>
这就是我坚持如何实现它的地方。我将很感谢您的建议。
答案 0 :(得分:1)
要在单个视图中编辑多个模型,您将必须基于这些模型渲染和处理多个ModelForm。
在多个模型实例上进行创建/更新操作的常见解决方案是django's formsets。
我建议您使用inline formsets和inlineformset_factory
,因为它确实使事情变得容易得多。
不要忘记在模板中包含management form,因为在处理表单集时会造成很多麻烦。
如果您不想编写过多的JavaScript,则在django-dynamic-formset之类的事情的前端可以完成这项工作。