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日程悩んでいますが解決にいたりません。
もしかしたら私の仮設が間違っているのかもしれないです。
アドバイスいただけるととても嬉しいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。