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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

293閲覧

Django(Python)にて関連テーブルの追加用テンプレートに親要素の引数を渡せない

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/18 02:13

Djangoにて出版業務の入稿システムを作っています。

問題の概要

本のタイトル、部、章、節、項という親要素(model:Bunch)があり、その子要素(model:Bunchrelate)としてページとページタイトルが紐づきます。子要素である、ページ、ページタイトルを追加するテンプレートをレンダーする部分で"NoReverseMatch"エラーが起きており、それを解決したいというのが主題です。おそらく原因は子要素を追加する画面で親要素のpkが引数としてテンプレートに渡っていないことだと予想しています。

##エラーの内容
bunchrelatelistにて一覧表示する画面でbunchrelateaddをレンダーしようとすると以下のようなエラーが発生します。
イメージ説明

関連情報

models.py

Bunch=書目、部、章、節、項といった親要素
Bunchrelate=Bunchに紐づく、ページ番号、ページタイトルといった子要素

from django.db import models from django.utils import timezone class Bunch(models.Model): categoryname = models.CharField(max_length=50, blank=False, null=False) chaptername = models.CharField(max_length=50, blank=False, null=False) sectionname = models.CharField(max_length=50, blank=False, null=False) termname = models.CharField(max_length=50, blank=False, null=False) created_at = models.DateTimeField(default=timezone.now) updated_at = models.DateTimeField(default=timezone.now) def __str__(self): return self.categoryname class Bunchrelate(models.Model): relatepages = models.CharField( max_length=7, unique=True, blank=False, null=False) slideheader = models.CharField(max_length=50, blank=False, null=False) bunch = models.ForeignKey(Bunch, on_delete=models.PROTECT) created_at = models.DateTimeField(default=timezone.now) updated_at = models.DateTimeField(default=timezone.now) def __str__(self): return self.relatepages

urls.py

from django.urls import path from . import views app_name = 'factors' urlpatterns = [ path('bunchlist/', views.bunchlist, name='bunchlist'), path('bunchlist/bunchadd/', views.bunchadd, name='bunchadd'), path('bunchlist/<int:pk>/bunchedit/', views.bunchedit, name='bunchedit'), path('bunchlist/<int:pk>/', views.bunchdelete, name='bunchdelete'), path('bunchlist/<int:pk>/bunchrelateadd/', views.bunchrelateadd, name='bunchrelateadd'), path('bunchlist/<int:pk>/bunchrelatelist/', views.bunchrelatelist, name='bunchrelatelist'), ]

views.py

from django.shortcuts import render, redirect, get_list_or_404, get_object_or_404 from django.http import HttpResponse from .models import Bunch, Bunchrelate, Details from .forms import BunchForm, BunchrelateForm from django.utils import timezone from django.forms import inlineformset_factory from django.db.models import ProtectedError from django.contrib import messages def bunchlist(request): ctx = { 'bunches': Bunch.objects.all(), } return render(request, 'factors/bunchlist.html', ctx) def bunchadd(request): if request.method == "POST": form = BunchForm(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() return redirect('factors:bunchlist') else: form = BunchForm() return render(request, 'factors/bunchadd.html', {'form': form}) # Create your views here. def bunchdelete(request, pk): bunch = get_object_or_404(Bunch, pk=pk) if request.method == 'POST': try: bunch.delete() except ProtectedError: messages.error(request, '紐付いている見開きページ情報等を削除してからでないと消せません') return redirect('factors:bunchlist') def bunchedit(request, pk): bunch = get_object_or_404(Bunch, pk=pk) if request.method == "POST": form = BunchForm(request.POST, instance=bunch) if form.is_valid(): bunch = form.save(commit=False) bunch.save() return redirect('factors:bunchlist') else: form = BunchForm(instance=bunch) return render(request, 'factors/bunchedit.html', {'form': form}) def bunchrelateadd(request, pk): if request.method == "POST": form = BunchrelateForm(request.POST) if form.is_valid(): bunchrelate = form.save(commit=False) bunchid = Bunch.objects.get(id=pk) bunchrelate.bunch = bunchid bunchrelate.save() return redirect('factors:bunchrelatelist', pk=bunchrelate.bunch.pk) else: form = BunchrelateForm() return render(request, 'factors/bunchrelateadd.html', {'form': form}) def bunchrelatelist(request, pk): ctx = { 'bunchrelates': Bunchrelate.objects.filter(bunch_id=pk), } return render(request, 'factors/bunchrelatelist.html', ctx)

bunchrelatelist.html

{% extends 'factors/base.html' %} {% block content %} <h2>紙面情報(部・章・節・項タイトル)</h2> <table class="table"> <thead class="thead-dark"> <tr> <th scope="col">見開きページ</th> <th scope="col">スライドタイトル</th> </tr> </thead> <tbody> {% for bunchrelate in bunchrelates %} <tr> <td>{{ bunchrelate.relatepages }}</td> <td>{{ bunchrelate.slideheader }}</td> </tr> <a href="{% url 'factors:bunchrelateadd' pk=bunchrelate.bunch.pk%}" >項目の追加</a > {% endfor %} </tbody> </table> <a href="{% url 'factors:bunchlist'%}">一覧へ戻る</a> {% endblock %}

bunchrelateadd.html

{% extends 'factors/base.html' %} {% block content %} <h2>見開きページ、タイトル</h2> <form method="POST" action=""> <table border="1"> {% csrf_token %} {{ form.as_table }} </table> <button type="submit" class="save btn btn-default">登録</button> </form> </form> <a href="{% url 'factors:bunchrelatelist'%}">見開き一覧へ戻る</a> {% endblock %}

3日程悩んでいますが解決にいたりません。
もしかしたら私の仮設が間違っているのかもしれないです。
アドバイスいただけるととても嬉しいです。

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

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

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

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

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

guest

回答1

0

下記で、bunchrelateというオブジェクトが存在しないからだと思います。
下記の前のforbunchrelateはスコープを外れています。

html

1<a href="{% url 'factors:bunchrelateadd' pk=bunchrelate.bunch.pk%}">項目の追加</a>

当該ビューはBunchに関連するBunchrelateモデルインスタンスのリストを表示するビューであるため、
Bunchrelateに親のBunchモデルインスタンスをコンテキストで渡して、下記のようにするのはどうでしょうか。

python

1from django.shortcuts get_object_or_404 2from .models. import Bunch, Bunchrelate 3def bunchrelatelist(request, pk): 4 ctx = { 5 'bunch': get_object_or_404(Bunch, pk=pk) 6 'bunchrelates': Bunchrelate.objects.filter(bunch_id=pk), 7 } 8 return render(request, 'factors/bunchrelatelist.html', ctx)

html

1<a href="{% url 'factors:bunchrelateadd' pk=bunch.pk%}">項目の追加</a>

投稿2020/07/19 10:50

hasami

総合スコア1277

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問