Реверс для 'new_entry' с аргументами '(' ',)' не найден. Попробован 1 шаблон (ов): ['new_entry / (? P [0-9] +) / $ '] - PullRequest
1 голос
/ 23 февраля 2020

Я недавно учусь 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 и идентификаторы входа в оболочке. topic id shell checkup

entry, entry_id

Ответы [ 3 ]

1 голос
/ 23 февраля 2020

Можете ли вы опубликовать шаблон вашего topics/<int:topic_id>/ представления? (django_apps/topic.html)

Мне кажется, что у вас в этом шаблоне {% url 'new_entry' %} без указания topic.id. Поскольку ваш путь для этого представления - 'new_entry/<int:topic_id>/', обратный URL не работает, и вы видите эту ошибку.

Возможно, вы захотите изменить {% url 'new_entry' %} на {% url 'new_entry' topic.id %} или что-то в этом роде.

1 голос
/ 23 февраля 2020

Вы передали свой шаблон topic_list , но в своем шаблоне вы использовали topi c. Я думаю, что вы установили бы al oop. Потому что у вас нет никакой переменной с именем topi c. Если вы их изменили, это сработает.

0 голосов
/ 23 февраля 2020

Вы, кажется, передаете пустую переменную в шаблон

    # Display a blank name or invalid form.
    context = {'topic': topic, 'form': form} # Change the context variable
    return render(request, 'django_apps/new_entry.html', context)

new_entry.html

...

{% block content %}
    <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>
{% endblock content %}
...
...