Django. Возвращает Page not found (404)
Изучаю Django по книге Эрика Мэтиза "Изучаем Python". Не удается зайти на страничку с формой. Выдает
Not Found: /new_entry/1/
[05/Feb/2020 20:18:18] "GET /new_entry/1/ HTTP/1.1" 404 2870
Я понимаю, что проблема в форме или в пути, но что именно понять не могу, так как по этому же принципу перед этим была добавлена первая форма.
Код learning_logs\urls.py
from django.urls import path
from . import views
app_name = 'learning_logs'
urlpatterns = [
#Вывод домашней страницы
path('', views.index, name='index'),
#Вывод всех тем
path('topics/',views.topics, name='topics'),
#Страница с информацией по выбранной теме
#path('^topics/(?P<topic_id>\d+)', views.topic, name='topic'),
path('topics/<int:topic_id>/', views.topic, name='topic'),
#Страница для создания новой темы
path('new_topic/',views.new_topic, name='new_topic'),
#Страница для добавления новой информации
path('new_entry/<int:topic_id>', views.new_entry, name='new_entry'),
]
Вьюхи learning_logs\views.py
from django.shortcuts import render
from django.urls import reverse
from django.http import HttpResponse, HttpResponseRedirect
from .models import Topic
from .forms import TopicForm,EntryForm
def index(request):
"""Домашняя страница проекта"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""Вывод всех тем"""
topics = Topic.objects.order_by('date_added')
context = {'topics':topics}
return render(request,'learning_logs/topics.html',context)
def topic(request,topic_id):
"""Выводит одну тему и все ее записи"""
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request,'learning_logs/topic.html',context)
def new_topic(request):
"""Определяет новую тему"""
if request.method != 'POST':
#Данные не отправлялись, создается новая форма
form = TopicForm()
else:
#отправленны данные, обработать данные
form =TopicForm(request.POST)
#если форма проходит валидацию
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form':form}
return render(request,'learning_logs/new_topic.html',context)
def new_entry(request, topic_id):
"""Добавляет новую запись по конкретной теме"""
topic = Topic.objects.get(id=topic_id)
if request.method != 'POST':
form = EntryForm()
else:
form = EntryForm(data=request.POST)
if form.is_valid():
new_entry = form.save(commit=False)
new_entry.topic = topic
new_entry.save()
return HttpResponseRedirect(reverse('learning_logs:topic',args=[topic_id]))
context = {'topic':topic,'form':form}
return render(request,'learning_logs/new_entry.html',context)
Шаблон, который отражается нормально и где есть ссылка на страницу с формой
learning_logs\templates\learning_logs\topic.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topic:{{ topic }}</p>
<p>Entries</p>
<p>
<a href="{% url 'learning_logs:new_entry' topic.id %}/">add new entry</a>
</p>
<ul>
{% for entry in entries %}
<li>{{entry.date_added|date:'M d,Y H:i' }}</li>
<li>{{entry.text|linebreaks }}</li>
{% empty %}
<li>
There are no entries for this topic yet.
</li>
{% endfor %}
</ul>
{% endblock content %}
Кликаем по ссылке и получаем Page not found (404)
И сама страница, которая не отражается
learning_logs\templates\learning_logs\new_entry.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
<p>Add a new entry:</p>
<form action="{% url 'learning_logs:new_entry' topic.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name='submit'>add entry</button>
</form>
{% endblock content %}
ДОПОЛНЕНИЕ
По совету камрада, в файле url поменял путь Было
path('new_entry/<int:topic_id>', views.new_entry, name='new_entry'),
Стало
path('topics/<int:topic_id>/new_entry/', views.new_entry, name='new_entry'),
Но тут выплыла такая проблема. При запросе почему то добавляется лишний знак "/" и соответственно, страница становится недоступна. Но если убрать в адресной строке лишний слеш, то она начинает отражаться. Теперь вопрос - как убрать это лишнее добавление? Потому что если в path я убираю слеш, все равно происходит тоже - он добавляется и страница становится недоступна из за неверного адреса
Ответы (1 шт):
Добавьте / к концу пути в urls.py, а в шаблоне уберите.
urls.py:
urlpatterns = [
path('new_entry/<int:topic_id>/', views.new_entry, name='new_entry'),
] # ^^^
topic.html:
<a href="{% url 'learning_logs:new_entry' topic.id %}">add new entry</a>
<!-- ^^ -->