python - 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
上下文或提供参数等等,但似乎没有任何效果。如果你好心让我知道发生了什么,我将不胜感激。
解决方案
尝试将此行更改为:
<form action="{% url 'new_entry' topic_id=topic.id %}" method='post'>
推荐阅读
- c - 在C语言中使用Gtk,判断一个widget是否也是不同类型的widget
- reactjs - next-mdx-remote 不通过组件
- python - 从 Google 地球引擎导出图像时,我可以在 QGIS Python 控制台的 for 循环中重复 task.start() 吗?
- javascript - 10 位或 6 位数字的正则表达式不应以“/”开头和结尾,也可以是字符串中的单个单词
- python - 如何创建具有相同键的字典列表?
- asp.net - webforms 所有执行异步回发的子节点,即使 updatemode 设置为条件
- python - SqlAlchemy - 函数总和的多列
- docker - 使用 docker compose 启动时,CORS 会阻止从前端到 Flask 服务器的请求
- octopus-deploy - 结构化变量替换不适用于 web.config (XML)
- xml - Ant 的 echo-task 和换行