「Django ManyToManyField formset」で検索すると良いのではないかと思います。
ただ、もし自分だったらスキルの値を入力するフォームをスキル数分用意しちゃうと思います。
追記しました
Formを複数使用する方法で実装してみました。
これ質問者様の意図したこととあってますでしょうか
Python 3.5.2
Django 2.0
models.py
python
1from django import forms
2from django.db import models
3
4
5class Skill(models.Model):
6 name = models.CharField(max_length=16, blank=True, null=False)
7 value = models.IntegerField()
8 owner = models.ForeignKey(
9 'Person', blank=True, null=True, on_delete=models.CASCADE)
10
11 def __str__(self):
12 return '%s %d' % (self.name, self.value)
13
14
15class Person(models.Model):
16 name = models.CharField(max_length=16, blank=True, null=False)
17
18 def __str__(self):
19 return self.name
20
21
22class PersonForm(forms.ModelForm):
23 class Meta:
24 model = Person
25 fields = {'name'}
26
27
28class SkillForm(forms.ModelForm):
29 class Meta:
30 model = Skill
31 fields = {'name', 'value'}
views.pyの一部
python
1def edit(request, person_id):
2 person = Person.objects.get(id=person_id)
3 skills = Skill.objects.filter(owner=person)
4 if request.method == 'POST':
5 personform = PersonForm(request.POST, instance=person, prefix='person')
6 skillforms = [SkillForm(request.POST, instance=skill,
7 prefix=skill.name) for skill in skills]
8 if personform.is_valid():
9 for form in skillforms:
10 if not form.is_valid():
11 break
12 form.save()
13 else:
14 return redirect('skill:home')
15 else:
16 personform = PersonForm(instance=person, prefix='person')
17 skillforms = [SkillForm(instance=skill, prefix=skill.name)
18 for skill in skills]
19 return render(request, 'skill/skill.html', {'personform': personform,
20 'skillforms': skillforms,
21 'person_id': person.id})
urls.pyの一部
python
1urlpatterns = [
2 path('edit/<int:person_id>', views.edit, name='edit'),
3]
skill.html
html
1<html>
2 <body>
3 <form action="{% url 'skill:edit' person_id %}" method="POST">
4 <table>
5 {{ personform.as_table }}
6
7 {% for skillform in skillforms %}
8 {{ skillform.as_table }}
9 {%endfor%}
10 </table>
11 {% csrf_token %}
12 <input type="submit" value="登録">
13 </form>
14 </body>
15</html>
実行結果
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/21 01:06
2018/06/21 02:21