首页 > 解决方案 > python速成课程学习日志项目没有反向匹配错误

问题描述

我正在关注 Python Crash Course 这本书,并正在尝试为 Django 做 Learning Logs 应用程序。一切都很顺利,除了我在第 19 章尝试为用户添加输入表单时。我遇到了错误

Reverse for 'new_entry' with arguments '('',)' not found.
1 pattern(s) tried: ['new_entry/(?P<topic_id>[0-9]+)/$']

我的 models.py 看起来像这样:

from django.db import models

# Create your models here.
class Topic(models.Model):
    """A topic the user is learning about"""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        """Return a string representation of the model."""
        return self.text

class Entry(models.Model):
    """Something specific learned about a topic"""
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'entries'

    def __str__(self):
        """Return a string representation of the model."""
        return self.text[:50] + "..."

My urls.py:

"""Defines url patterns for learning_logs"""

from django.urls import path

from . import views

urlpatterns = [
    # Homepage
    path('', views.index, name='index'),
    path('topics/', views.topics, name='topics'),
    #Detail page for 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'),
]

我的意见.py:

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse

from .models import Topic
from .forms import TopicForm, EntryForm


def index(request):
    """The homepage for learning Log"""
    return render(request, 'learning_logs/index.html')

def topics(request):
    """show all topics"""
    topics = Topic.objects.order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

def topic(request, topic_id):
    """Show a single topic and all its entries"""
    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):
    """Add a new topic"""
    if request.method != 'POST':
        #No date submitted then create a blank form
        form = TopicForm()
    else:
        # POST data submitted; process date
        form =  TopicForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('topics'))

    context = {'form': form}
    return render(request, 'learning_logs/new_topic.html', context)

def new_entry(request, topic_id):
    """add a new entry for a particular topic"""
    topic = 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():
            new_entry = form.save(commit=False)
            new_entry.topic = topic
            new_entry.save()
            return HttpResponseRedirect(reverse('topic', args=[topic_id]))

    context = {'topic': topic, 'form': form, 'topic_id':topic_id}
    return render(request, 'learning_logs/new_entry.html', context)

我的 new_entry.html:

{% extends "learning_logs/base.html" %}

{% block content %}

<p><a href="{% url 'topic' topic.id %}">{{ topic }}</a></p>

<p>Add a new entry:</p>

<form action="{% url 'new_entry' topic.id %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name='submit'>add entry</button>
</form>

{% endblock content %}

我的base.html:

<p>
    <a href="{% url 'index' %}">Learning Log</a> -
    <a href="{% url 'topics' %}">Topics</a>
</p>

{% block content %}{% endblock content %}

索引.html:

{% extends "learning_logs/base.html" %}

{% block content %}
<p>Learning Log helps you keep track of your learning, for any topic you're learning about. </p>
{% endblock content %}

我的主题.html:

{% extends "learning_logs/base.html" %}

{% block content %}
<p>Topics</p>

<ul>
    {% for topic in topics %}
        <li>
            <a href="{% url 'topic' topic.id %}">{{ topic }}</a>
        </li>
    {% empty %}
        <li>No topics have been added yet.</li>
    {% endfor %}
</ul>

<a href="{% url 'new_topic' %}">Add a new topic</a>

{% endblock content %}

我的 new_topic.html:

{% extends "learning_logs/base.html" %}

{% block content %}
<p>Topics</p>

<ul>
    {% for topic in topics %}
        <li>
            <a href="{% url 'topic' topic.id %}">{{ topic }}</a>
        </li>
    {% empty %}
        <li>No topics have been added yet.</li>
    {% endfor %}
</ul>

<a href="{% url 'new_topic' %}">Add a new topic</a>

{% endblock content %}

我的topic.html:

{% extends "learning_logs/base.html" %}

{% block content %}

<p>Topic: {{ topic }}</p>

<p>Entries:</p>
<p>
    <a href="{% url '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 no entries for this topic yet.
    </li>
{% endfor %}
</ul>

{% endblock content %}

我不确定发生了什么事。我确实阅读了现有线程并遵循了一些建议,说明我需要添加'topic_id':topic上下文或提供参数等等,但似乎没有任何效果。如果你好心让我知道发生了什么,我将不胜感激。

标签: pythondjango

解决方案


尝试将此行更改为:

<form action="{% url 'new_entry' topic_id=topic.id %}" method='post'>

推荐阅读