teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

実行結果について記述しました

2018/06/20 10:07

投稿

tatamyiwathy
tatamyiwathy

スコア1045

answer CHANGED
@@ -97,5 +97,6 @@
97
97
  ```
98
98
 
99
99
 
100
+ **実行結果**
100
101
 
101
102
  ![実行結果](f96ff5f6a134ca25285e2c2f63be1645.png)

2

実行結果の画像を掲載しました

2018/06/20 10:07

投稿

tatamyiwathy
tatamyiwathy

スコア1045

answer CHANGED
@@ -98,4 +98,4 @@
98
98
 
99
99
 
100
100
 
101
- [実行結果](bb61d10402fdbf79851b5118d7f47351.png)
101
+ ![実行結果](f96ff5f6a134ca25285e2c2f63be1645.png)

1

回答したあと気になったので少し実装してみました。ManyToManyFieldではなくForeignKeyを使用していますので質問者様の意図から外れてるかもしれません。

2018/06/20 10:06

投稿

tatamyiwathy
tatamyiwathy

スコア1045

answer CHANGED
@@ -1,3 +1,101 @@
1
1
  「Django ManyToManyField formset」で検索すると良いのではないかと思います。
2
2
 
3
- ただ、もし自分だったらスキルの値を入力するフォームをスキル数分用意しちゃうと思います。
3
+ ただ、もし自分だったらスキルの値を入力するフォームをスキル数分用意しちゃうと思います。
4
+
5
+
6
+ **追記しました**
7
+ Formを複数使用する方法で実装してみました。
8
+ これ質問者様の意図したこととあってますでしょうか
9
+
10
+ Python 3.5.2
11
+ Django 2.0
12
+
13
+ **models.py**
14
+ ```python
15
+ from django import forms
16
+ from django.db import models
17
+
18
+
19
+ class Skill(models.Model):
20
+ name = models.CharField(max_length=16, blank=True, null=False)
21
+ value = models.IntegerField()
22
+ owner = models.ForeignKey(
23
+ 'Person', blank=True, null=True, on_delete=models.CASCADE)
24
+
25
+ def __str__(self):
26
+ return '%s %d' % (self.name, self.value)
27
+
28
+
29
+ class Person(models.Model):
30
+ name = models.CharField(max_length=16, blank=True, null=False)
31
+
32
+ def __str__(self):
33
+ return self.name
34
+
35
+
36
+ class PersonForm(forms.ModelForm):
37
+ class Meta:
38
+ model = Person
39
+ fields = {'name'}
40
+
41
+
42
+ class SkillForm(forms.ModelForm):
43
+ class Meta:
44
+ model = Skill
45
+ fields = {'name', 'value'}
46
+ ```
47
+
48
+ **views.pyの一部**
49
+ ```python
50
+ def edit(request, person_id):
51
+ person = Person.objects.get(id=person_id)
52
+ skills = Skill.objects.filter(owner=person)
53
+ if request.method == 'POST':
54
+ personform = PersonForm(request.POST, instance=person, prefix='person')
55
+ skillforms = [SkillForm(request.POST, instance=skill,
56
+ prefix=skill.name) for skill in skills]
57
+ if personform.is_valid():
58
+ for form in skillforms:
59
+ if not form.is_valid():
60
+ break
61
+ form.save()
62
+ else:
63
+ return redirect('skill:home')
64
+ else:
65
+ personform = PersonForm(instance=person, prefix='person')
66
+ skillforms = [SkillForm(instance=skill, prefix=skill.name)
67
+ for skill in skills]
68
+ return render(request, 'skill/skill.html', {'personform': personform,
69
+ 'skillforms': skillforms,
70
+ 'person_id': person.id})
71
+ ```
72
+
73
+ **urls.pyの一部**
74
+ ```python
75
+ urlpatterns = [
76
+ path('edit/<int:person_id>', views.edit, name='edit'),
77
+ ]
78
+ ```
79
+
80
+ **skill.html**
81
+ ```html
82
+ <html>
83
+ <body>
84
+ <form action="{% url 'skill:edit' person_id %}" method="POST">
85
+ <table>
86
+ {{ personform.as_table }}
87
+
88
+ {% for skillform in skillforms %}
89
+ {{ skillform.as_table }}
90
+ {%endfor%}
91
+ </table>
92
+ {% csrf_token %}
93
+ <input type="submit" value="登録">
94
+ </form>
95
+ </body>
96
+ </html>
97
+ ```
98
+
99
+
100
+
101
+ [実行結果](bb61d10402fdbf79851b5118d7f47351.png)