Django Error during template rendering In template ... error at line 0
Пишу сайт на Django по книги Дронова. Использую Django 3.0. И в главе 2.7 "Наследование шаблонов" вылезает ошибка:
Error during template rendering In template C:\Python\Django 3\samplesite\bboard\templates\layout\basic.html, error at line 0 Reverse for 'by_rubric' with arguments '('',)' not found. 1 pattern(s) tried: ['bboard/(?P<rubric_id>[0-9]+)/$']
что делать, и как может быть ошибка в строке 0?
Basic.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}Главная{% endblock %} :: Доска объявлений</title>
</head>
<body>
<header>
<h1>Объявления</h1>
</header>
<nav>
<a href="{% url 'index' %}">Главная</a>
<a href="{% url 'add' %}">Добавить</a>
{% for rubric in rubrics %}
<a href="{% url 'by_rubric' rubric.pk %}">{{ rubric.name }}</a>
{% endfor %}
</nav>
<section>
{% block content %}
{% endblock %}
{% block paginator %}
{% endblock %}
</section>
</body>
</html>
index.html:
{% extends "layout/basic.html" %}
{% block content %}
{% for bb in bbs %}
<div>
<h2>{{ bb.title }}</h2>
<p>{{ bb.content }}</p>
<p><a href="{% url 'by_rubric' bb.rubric.pk %}">{{ bb.rubric.name }}</a></p>
<p>{{ bb.published|date:"d.m.Y H:i:s" }}</p>
</div>
{% endfor %}
{% endblock %}
{% block paginator %}
{% if page.has_previous %}
<a href="?page={{ page.previous_page_number }}"><</a>
|
{% endif %}
Часть №{{ page.number }} из {{ page.paginator.num_pages }}
{% if page.has_next %}
|
<a href="?page={{ page.next_page_number }}">></a>
{% endif %}
{% endblock %}
views.py:
from django.shortcuts import render
from django.core.paginator import Paginator
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Bb
from .models import Rubric
from .forms import BbForm
class BbCreateView(CreateView):
template_name = 'bboard/create.html'
form_class = BbForm
success_url = reverse_lazy('index')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['rubrics'] = Rubric.objects.all()
return context
def index(request):
bbs = Bb.objects.all()
rubrics = Rubric.objects.all()
paginator = Paginator(bbs,5)
if 'page' in request.GET:
page_num = request.GET['page']
else:
page_num = 1
page = paginator.get_page(page_num)
context = {'bbs': bbs, 'rubrics': rubrics,'page': page, 'bbs':page.object_list}
return render(request,'bboard/index.html',context)
def by_rubric(request,rubric_id):
bbs = Bb.objects.filter(rubric = rubric_id)
rubrics = Rubric.objects.all()
current_rubric = Rubric.objects.get(pk=rubric_id)
paginator = Paginator(bbs, 5)
if 'page' in request.GET:
page_num = request.GET['page']
else:
page_num = 1
page = paginator.get_page(page_num)
context = {'bbs': bbs, 'rubrics': rubrics, 'page': page, 'bbs': page.object_list,'current_rubric':current_rubric}
return render(request,'bboard/by_rubric.html',context)
models.py
from django.db import models
class Bb(models.Model):
title = models.CharField(max_length=50, verbose_name='Товар')
content = models.TextField(null=True, blank=True,
verbose_name='Описание')
price = models.FloatField(null=True, blank=True, verbose_name='Цена')
published = models.DateTimeField(auto_now_add=True, db_index=True,
verbose_name='Опубликовано')
rubric = models.ForeignKey('Rubric', null=True, on_delete=models.PROTECT, verbose_name = 'Рубрика')
class Meta:
verbose_name_plural = 'Объявления'
verbose_name = 'Объявление'
ordering = ['-published']
class Rubric(models.Model):
name = models.CharField(max_length=20, db_index=True, verbose_name='Название')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = 'Рубрики'
verbose_name = 'Рубрика'
ordering = ['name']
Ошибка вылезает при переходе на страницу http://127.0.0.3:8000/bboard/?page=2. Там применяется пагинация. До того как я начал писать шаблоны с наследованием всё было нормально, ошибка появилась в разделе 2.7 .
Ответы (1 шт):
rubric = models.ForeignKey('Rubric', null=True,...
Вот здесь вероятно и есть проблема - у вас может не быть рубрики. Убедитесь, что у выводимого bb есть рубрика, а потом выводите ссылку. Либо замените ваш
<p><a href="{% url 'by_rubric' bb.rubric.pk %}">{{ bb.rubric.name }}</a></p>
на что то вроде
{% url 'by_rubric' bb.rubric.pk as bb_rubric_url %}
{% if bb_rubric_url %}
<p><a href="{{ bb_rubric_url">{{ bb.rubric.name }}</a></p>
{% else %}
Нет связи с рубрикой
{% endif %}
else добавлен чисто чтобы вы увидели, где проблема
