質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

2740閲覧

Django: ManyToManyFieldにデータを紐付ける

nazo_o

総合スコア99

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/19 11:40

編集2018/06/19 11:41

Djangoで、例えば、「Skill」と「Person」というmodelを作成し、Person側から、models.ManyToManyFieldで紐付けを行うとします。Skillにはscore属性が存在し、そのスキルのスコアが高いほど、高いスキルを持つとします。

すると、Person側のProject属性では、「SkillA:87」、「SkillB:45」、「SkillC:62」、「SkillD:100」、、、のような項目が並んでしまいます。

理想としては、「SkillA」、「SkillB」、「SkillC」、「SkillD」、、、のように並んで、その項目それぞれに数値を入力したいところです。

これをするにはどのようにすればよいでしょうか?連想配列とmodels.ManyToManyFieldを組み合わせる方法など調べてもなかなか見当たらないようです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

「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/20 06:20

編集2018/06/20 10:07
tatamyiwathy

総合スコア1039

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nazo_o

2018/06/21 01:06

実装までしていただきありがとうございます!自分の説明不足なのですが、自分の意味していたこととしては、スキル自体にownerはおらず、誰からでも参照できますが、参照したスキルのスコアは個人によって異なるという感じです。これがどのようにするのかわからずに悩んでいます!
tatamyiwathy

2018/06/21 02:21

こんな感じことを実現したいということでしょうか。 ``` Person1 - SkillA(100),SkillB(200),SkillC(300) Person2 - SkillA(50) Person3 - SkillB(20),SkillC(500) ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問