Я недавно учусь Django, и я хочу веб-приложение для отслеживания обучения с Django. Ошибка возникла, когда я создавал функцию и шаблон для новых записей - это позволит пользователю написать подробное примечание о топике c, о которой он в настоящее время узнает, но всякий раз, когда я запускаю шаблон, я получаю сообщение об ошибке:
Реверс для 'new_entry' с аргументами '(' ',)' не найден. Попробован 1 шаблон (ов): ['new_entry / (? P [0-9] +) / $'].
Я попытался просмотреть последнюю функцию new_entry (), которую я написал, и настроить имя переменной topi c, но не решил проблему. Я также перекрестно проверил пути URL-адресов на наличие орфографических ошибок или пробелов, но это не так. Вот мои файлы проекта.
urls.py
from django.urls import path
from . import views
app_name = 'django_apps'
urlpatterns = [
# Home page
path('', views.index, name='index'),
# Page that shows all topics.
path('topics/', views.topics, name='topics'),
# Detail page for a single topic.
path('topics/<int:topic_id>/', views.topic, name='topic'),
# Page for adding a new topic.
path('new_topic/', views.new_topic, name='new_topic'),
# Page for adding a new entry.
path('new_entry/<int:topic_id>/', views.new_entry, name='new_entry'),
]
views.py:
from django.shortcuts import render, redirect
from .models import Topic
from .forms import TopicForm, EntryForm
# Create your views here.
def index(request):
"""The home page for django app."""
return render(request, 'django_apps/index.html')
def topics(request):
"""Show all topic"""
topics_list = Topic.objects.order_by('id')
context = {'topics_list': topics_list}
return render(request, 'django_apps/topics.html', context)
def topic(request, topic_id):
"""Get topic and all entries associated with it."""
topic_list = Topic.objects.get(id=topic_id)
entries = topic_list.entry_set.order_by('-date_added')
context = {'topic_list': topic_list, 'entries': entries}
return render(request, 'django_apps/topic.html', context)
def new_topic(request):
"""Add a new topic."""
if request.method != 'POST':
# No data submitted; create a blank form.
form = TopicForm()
else:
# POST data submitted; process data.
form = TopicForm(data=request.POST)
if form.is_valid():
form.save()
return redirect('django_apps:topics')
# Display a blank name or invalid form.
context = {'form': form}
return render(request, 'django_apps/new_topic.html', context)
def new_entry(request, topic_id):
"""Add a new entry for a topic."""
topic_list = Topic.objects.get(id=topic_id)
if request.method != 'POST':
# NO data submitted; create a blank form.
form = EntryForm()
else:
# POST data submitted; process data.
form = EntryForm(data=request.POST)
if form.is_valid():
latest_entry = form.save(commit=False)
latest_entry.topic = topic_list
latest_entry.save()
return redirect('django_apps:topic', topic_id=topic_id)
# Display a blank name or invalid form.
context = {'topic_list': topic_list, 'form': form}
return render(request, 'django_apps/new_entry.html', context)
new_entry. html (обновлено!):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Study Tracker - Entry</title>
</head>
<body>
{% extends 'django_apps/base.html' %}
{% block content %}
{% for topic in topic_list %}
<p><a href="{% url 'django_apps:topic' topic_id=topic.id %}">{{ topic }}</a></p>
<p>Add a new entry:</p>
<form action="{% url 'django_apps:new_entry' topic_id=topic.id %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">Add entry</button>
</form>
{% endfor %}
{% endblock content %}
</body>
</html>
base. html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Base template</title>
</head>
<body>
<p>
<a href="{% url 'django_apps:index' %}">Study Tracker</a> -
<a href="{% url 'django_apps:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
</body>
</html>
forms.py:
from django import forms
from .models import Topic, Entry
class TopicForm(forms.ModelForm):
"""A class that defines the form in which a user can enter in a topic."""
class Meta:
"""This class tells django which model to base the form on and the
fields to include in the form."""
model = Topic
fields = ['text']
labels = {'text': ''}
class EntryForm(forms.ModelForm):
"""A class that defines the form in which a user can fill in an entry to
a topic."""
class Meta:
"""This meta class tells django which model to base the form for
entries on and the fields to include in the form."""
model = Entry
fields = ['text']
labels = {'text': 'Entry:'}
widgets = {'text': forms.Textarea(attrs={'cols': 80})}
Я не знаю, как go решить эту проблему. Я проверил все свои URL-адреса наследования и шаблоны на наличие ошибок, но я не могу понять, в чем проблема.
Обновление: вот мой шаблон topi c. html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Study Tracker - Topic</title>
</head>
<body>
{% extends 'django_apps/base.html' %}
{% block content %}
<p>Topic: {{ topic }}</p>
<p>Entries:</p>
<p>
<a href="{% url 'django_apps:new_entry' topic.id %}">Add new entry</a>
</p>
<ul>
{% for entry in entries %}
<li>
<p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
<p>{{ entry.text|linebreaks }}</p>
</li>
{% empty %}
<li>There are currently no entries for this topic.</li>
{% endfor %}
</ul>
{% endblock content %}
</body>
</html>
Я также проверил topi c и идентификаторы входа в оболочке.