Ich lerne Django neu und möchte eine Study Tracker-Web-App mit Django. Der Fehler trat auf, als ich die Funktion und Vorlage für neue Einträge erstellte. Auf diese Weise kann ein Benutzer eine detaillierte Notiz zu einem Thema schreiben, über das er gerade lernt. Bei jedem Ausführen der Vorlage wird jedoch eine Fehlermeldung angezeigt Botschaft:

Umkehrung für 'new_entry' mit Argumenten '(' ',)' nicht gefunden. 1 Muster versucht: ['new_entry / (? P [0-9] +) / $'].

Ich habe versucht, mir die neueste Funktion new_entry () anzusehen, die ich geschrieben habe, und den Namen der Themenvariablen zu optimieren, aber das Problem wurde nicht gelöst. Ich habe auch meine URL-Pfade auf Rechtschreibfehler oder Leerzeichen überprüft, aber es gibt keine. Hier sind meine Projektdateien.

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 (aktualisiert!):

<!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})}

Ich weiß nicht, wie ich dieses Problem beheben soll. Ich habe alle meine Vererbungs-URLs und -Vorlagen auf Fehler überprüft, kann aber nicht herausfinden, was das Problem zu sein scheint.

Update: Hier ist meine Vorlage topic.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>

Ich habe auch das Thema und die Eintrags-IDs in der Shell überprüft. Überprüfung der Themen-ID-Shell

entry, entry_id

1
Mr JPM 23 Feb. 2020 im 14:15

3 Antworten

Beste Antwort

Sie haben Ihre Vorlage topic_list übergeben, aber in Ihrer Vorlage haben Sie topic verwendet. Ich denke, Sie würden eine Schleife setzen. Weil Sie keine Variable mit dem Namen topic haben. Wenn Sie sie geändert haben, wird es funktionieren.

1
kamilyrb 23 Feb. 2020 im 11:25

Können Sie die Vorlage Ihrer topics/<int:topic_id>/ Ansicht veröffentlichen? (django_apps/topic.html)

Für mich sieht es so aus, als hätten Sie in dieser Vorlage ein {% url 'new_entry' %} ohne Angabe eines topic.id. Da Ihr Pfad für diese Ansicht 'new_entry/<int:topic_id>/' lautet, schlägt die umgekehrte URL fehl und Sie sehen diesen Fehler.

Sie möchten wahrscheinlich {% url 'new_entry' %} in {% url 'new_entry' topic.id %} oder ähnliches ändern.

1
Zat42 23 Feb. 2020 im 11:32

Sie scheinen eine leere Variable an die Vorlage zu übergeben

    # 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 %}
...
0
jackotonye 23 Feb. 2020 im 13:19