NoReverseMatch at / - Обратное направление для 'new_entry' с аргументами '(' ',)' не найдено - PullRequest
0 голосов
/ 09 мая 2020

Я пытался найти решение этой проблемы по всему миру, а также потратил много разочаровывающих часов, глядя на код, пытаясь понять, как это исправить.

Я новичок в 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})}

Да хоть убей, я не могу понять этого так что любая помощь спасет мой рассудок.

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...