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

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

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

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

Q&A

0回答

366閲覧

複数の追加フォームから入力されたデータを一覧に別々に表示したい

waruhime

総合スコア12

Django

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

0グッド

0クリップ

投稿2021/06/27 02:57

編集2021/06/27 03:01

前提・実現したいこと

Djangoでメンバ一覧から資格や経歴情報を表示させたいです。
どなたかご教授お願い致します。

イメージ
メンバー一覧画面
→メンバー一覧から情報を見たいメンバーの資格の一覧ボタンをクリック
→資格と経歴の一覧が表示される
→資格と経歴にはそれぞれ追加ボタンが有り、フォームから追加ができる

![メンバ一覧画面

資格の一覧ボタン押したあとの画面

発生している問題・エラーメッセージ

資格の一覧の追加ボタンを押してフォームから送信ボタンを押すと
資格の一覧には追加される。

同様に、経歴の追加ボタンを押してフォームから送信ボタンを押しても
経歴の一覧には追加されない。

該当のソースコード

views.py

class SkillList(ListView): """資格の一覧""" context_object_name='Skills' template_name='createuser/skill_list.html' paginate_by = 5 # 1ページは最大2件ずつでページングする def get(self, request, *args, **kwargs): member = get_object_or_404(Member, pk=kwargs['member_id']) # 親のメンバ Skills = member.Skills.all().order_by('id') # メンバの子供の、資格 self.object_list = Skills context = self.get_context_data(object_list=self.object_list, member=member) return self.render_to_response(context) def skill_edit(request, member_id, skill_id=None): """資格の編集""" member = get_object_or_404(Member, pk=member_id) # 親のメンバを読む if skill_id: # impression_id が指定されている (修正時) skill = get_object_or_404(Skill, pk=skill_id) else: # impression_id が指定されていない (追加時) skill = Skill() if request.method == 'POST': form = SkillForm(request.POST, instance=skill) # POST された request データからフォームを作成 if form.is_valid(): # フォームのバリデーション skill = form.save(commit=False) skill.member = member # この資格の、親のメンバをセット skill.save() return redirect('createuser:skill_list', member_id=member_id) else: # GET の時 form = SkillForm(instance=skill) # インスタンスからフォームを作成 return render(request, 'createuser/skill_edit.html', dict(form=form, member_id=member_id, skill_id=skill_id)) def skill_del(request, member_id, skill_id): """資格の削除""" skill = get_object_or_404(Skill, pk=skill_id) skill.delete() return redirect('createuser:skill_list', member_id=member_id) class HistoryList(ListView): """経歴の一覧""" context_object_name='Historys' template_name='createuser/skill_list.html' paginate_by = 5 # 1ページは最大2件ずつでページングする def get(self, request, *args, **kwargs): member = get_object_or_404(Member, pk=kwargs['member_id']) # 親のメンバ Historys = member.Historys.all().order_by('id') # メンバの子供の、経歴 self.object_list = Historys context = self.get_context_data(object_list=self.object_list, member=member) return self.render_to_response(context) def history_edit(request, member_id, history_id=None): """経歴の編集""" member = get_object_or_404(Member, pk=member_id) # 親のメンバ if history_id: # 指定されている (修正時) history = get_object_or_404(History, pk=history_id) else: # i指定されていない (追加時) history = History() if request.method == 'POST': form = HistoryForm(request.POST, instance=history) # POST された request データからフォームを作成 if form.is_valid(): # フォームのバリデーション history = form.save(commit=False) history.member = member history.save() return redirect('createuser:skill_list', member_id=member_id) else: # GET の時 form = HistoryForm(instance=history) # インスタンスからフォームを作成 return render(request, 'createuser/history_edit.html', dict(form=form, member_id=member_id, history_id=history_id)) def history_del(request, member_id, history_id): """経歴の削除""" history = get_object_or_404(History, pk=history_id) history.delete() return redirect('createuser:history_list', member_id=member_id)

forms.py

class SkillForm(ModelForm): """資格のフォーム""" class Meta: model = Skill fields = ('skill', 'state', ) class HistoryForm(ModelForm): """経歴のフォーム""" class Meta: model = History fields = ('period', 'matter', 'comment', )

skill_list.html

{% block content %} <h4 class="mt-4 border-bottom">資格の一覧 <small class="text-muted ml-3">{{ member.name }}</small></h4> <a href="{% url 'createuser:skill_add' member_id=member.id %}" class="btn btn-primary btn-sm my-3">追加</a> <table class="table table-striped table-bordered"> <thead> <tr> <th>資格</th> <th>状況</th> <th>操作</th> </tr> </thead> <tbody> {% for skill in Skills %} <tr> <!-- <td>{{ skill.id }}</td> --> <td>{{ skill.skill }}</td> <td>{{ skill.state }}</td> <td> <a href="{% url 'createuser:skill_mod' member_id=member.id skill_id=skill.id %}" class="btn btn-outline-primary btn-sm">修正</a> <button class="btn btn-outline-danger btn-sm del_confirm" data-toggle="modal" data-target="#deleteModal" data-pk="{{ skill.id }}" data-url="{% url 'createuser:skill_del' member_id=member.id skill_id=skill.id %}">削除</button> </td> </tr> {% endfor %} </tbody> </table> <h4 class="mt-4 border-bottom">経歴 <small class="text-muted ml-3">{{ member.name }}</small></h4> <a href="{% url 'createuser:history_add' member_id=member.id %}" class="btn btn-primary btn-sm my-3">追加</a> <table class="table table-striped table-bordered"> <thead> <tr> <th>期間</th> <th>案件名</th> <th>内容</th> <th>操作</th> </tr> </thead> <tbody> {% for history in Historys %} <tr> <!-- <td>{{ skill.id }}</td> --> <td>{{ history.period }}</td> <td>{{ history.matter }}</td> <td>{{ history.comment }}</td> <td> <a href="{% url 'createuser:history_mod' member_id=member.id history_id=history.id %}" class="btn btn-outline-primary btn-sm">修正</a> <button class="btn btn-outline-danger btn-sm del_confirm" data-toggle="modal" data-target="#deleteModal" data-pk="{{ history.id }}" data-url="{% url 'createuser:history_del' member_id=member.id history_id=history.id %}">削除</button> </td> </tr> {% endfor %} </tbody> </table>

models.py

class Skill(models.Model): 取得予定 = '取得予定' 取得中 = '取得中' 取得済み = '取得済み' state = [ (取得予定, '取得予定'), (取得中, '取得中'), (取得済み, '取得済み'), ] """感想""" member = models.ForeignKey(Member, verbose_name='名前', related_name='Skills', on_delete=models.CASCADE) skill = models.CharField('資格', max_length=255) state = models.CharField('状況', max_length=255, choices=state, default='取得済み') def __str__(self): return self.skill class History(models.Model): member = models.ForeignKey(Member, verbose_name='名前', related_name='Historys', on_delete=models.CASCADE) period = models.CharField('yymm ~ yymm', max_length=255) matter = models.CharField('案件', max_length=255) comment = models.TextField( verbose_name='業務内容,必要な知識', blank=True, null=False, max_length=1000,)

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問