Я пытался найти решение этой проблемы по всему миру, а также потратил много разочаровывающих часов, глядя на код, пытаясь понять, как это исправить.
Я новичок в Python и прорабатываю курс Python Cra sh, создавая веб-приложение с использованием Django, в частности, главу 19-1, где мне нужно воссоздать шаги, чтобы сделать блог.
Я думал, что адаптировал код для этого проекта, но это не выглядит так, поскольку я продолжаю получать эту ошибку NoReverseMatch. Теперь я понимаю, что это связано с невозможностью найти страницу - либо через шаблон, либо из-за ошибки в коде. Проблема в том, что я не вижу, что не так.
Ошибка:
Reverse for 'new_entry' with arguments '('',)' not found. 1 pattern(s) tried: ['new_post/(?P<post_id>[0-9]+)/$']
Error during template rendering
In template C:\Users\mcgar\Documents\blog\blog\templates\blog\base.html, error at line 0
Reverse for 'new_entry' with arguments '('',)' not found. 1 pattern(s) tried: ['new_post/(?P<post_id>[0-9]+)/$']
1 <p>
2 <a href="{% url 'blog:index' %}">Blog</a>
3 </p>
4
5 {% block content %}{% endblock content %}
Вот мои файлы:
views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from .models import BlogPost
from .forms import PostForm, EntryForm
def index(request):
'''The home page for blog and shows all posts'''
posts = BlogPost.objects.order_by('date_added')
context = {'posts': posts}
return render(request, 'blog/index.html', context)
def new_post(request):
"""Add a new title"""
if request.method != 'POST':
"""No data submitted, blank form"""
form = PostForm()
else:
#POST submitted data
form = PostForm(data=request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('blog:index'))
#Display a blank or invalid form
context = {'form': form}
return render(request, 'blog/new_post.html', context)
def new_entry(request, post_id):
"""Add new entry for a post"""
post = BlogPost.objects.get(id=post_id)
if request.method != 'POST':
#No data submitted
form = EntryForm()
else:
#POST data submitted
form = EntryForm(data=request.POST)
if form.is_valid():
new_entry = form.save(commit=False)
new_entry.post = post
new_entry.save()
return HttpResponseRedirect(reverse('blog:index', post_id=post_id))
#Display blank or invalid form
context = {'text': post, 'form': form}
return render(request, 'blog/new_entry.html', context)
base. html (базовый шаблон )
<p>
<a href="{% url 'blog:index' %}">Blog</a>
</p>
{% block content %}{% endblock content %}
index. html
{% extends "blog/base.html" %}
{% block content %}
<p>Blog Posts</p>
<ul>
{% for post in posts %}
<li>{{ post }}</li>
{% empty %}
<li>No posts have been added yet.</li>
{% endfor %}
<a href="{% url 'blog:new_post' %}">Add a new post</a>
<p>
<a href="{% url 'blog:new_entry' post.id %}">Add a new entry</a>
</p>
</ul>
{% endblock content %}
new_post. html
{% extends "blog/base.html" %}
{% block content %}
<p>New post</p>
<p>Title:</p>
<form action="{% url 'blog:new_post' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">Add title</button>
</form>
{% endblock content %}
new_entry. html
{% extends "blog/base.html" %}
{% block content %}
<p><a href="{% url 'blog:index' post.id %}">{{ post }}</a></p>
<p>Add entry:</p>
<form action="{% url 'blog:new_entry' post.id %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">Add entry</button>
</form>
{% endblock content %}
urls.py
"""Defines URL patterns for blog"""
from django.urls import path, include
from . import views
app_name = 'blog'
urlpatterns = [
#home page
path('', views.index, name='index'),
#page for new posts
path('new_post/', views.new_post, name='new_post'),
#Adding a new entry
path('new_post/<int:post_id>/', views.new_entry, name="new_entry"),
]
models.py
from django.db import models
# Create your models here.
class BlogPost(models.Model):
'''A blog'''
title = models.CharField(max_length=200)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
'''Return a string representation of the model.'''
return self.title
forms.py
from django import forms
from .models import BlogPost
class PostForm(forms.ModelForm):
class Meta:
model = BlogPost
fields = ['title']
labels = {'title': ''}
class EntryForm(forms.ModelForm):
class Meta:
model = BlogPost
fields = ['text']
labels = {'text': ''}
widgets = {'text': forms.Textarea(attrs={'cols':80})}
Да хоть убей, я не могу понять этого так что любая помощь спасет мой рассудок.
Большое спасибо!