Я получаю ошибку NoReverseMatch на своей домашней странице

#django #django-templates

#django #django-шаблоны

Вопрос:

Я получаю NoReverseMatch ошибку на своей домашней странице. Это из html, который я ввел из своего приложения для объявлений. В нем говорится, что обратная сторона ссылки не может быть найдена. Когда я удалил эту строку, она показывает карточку, но текст с тегом шаблона.

_announcement_home.html :

 <div class="container">
    <div class="card announcement-card" style="width: 18rem;">
      <h5 class="card-header">Announcement</h5>
      <div class="card-body">
        <h5 class="card-title">{{announcement.title}}</h5>
        <p class="card-text">{{announcement.text}}</p>
        <span class="announcement-date">{{announcement.date}}</span>
        {% if user.is_authenticated %}
          <a href="{% url 'announcement:single' pk=self.pk %}" class="btn btn-info">Change</a>
        {% endif %}
  
      </div>
    </div>
<br>


    
</div>
    
 

index.html :

 {% extends 'base.html' %}


{% block content %}
<div class="w3-container w3-teal">
<h1>BANNER HERE</h1> 
<p>Dito yung banner</p> 
</div>

{% include 'announcement/_announcement_home.html' %}

{% endblock  %}
 

urls.py :

 from django.urls import path
from . import views

app_name = 'announcement'

urlpatterns = [
    path('create/', views.AnnouncementCreateView.as_view(), name='create'),
    path('', views.AnnouncementListView.as_view(), name='list'),
    path('posts/<int:pk>/', views.AnnouncementDetailView.as_view(), name='single'),
    path('delete/<int:pk>/', views.AnnouncementDeleteView.as_view(), name='destroy'),
    path('edit/<int:pk>/', views.AnnouncementUpdateView.as_view(), name='edit')
]
 

main urls.py :

 """urcipro URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from home import views
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.Home.as_view(), name='home'),
    path('bod/', views.BOD.as_view(), name='bod'),
    path('announcement/', include('announcement.urls')),
]   static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 

views.py :

 from django.shortcuts import render
from django.views import generic
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy, reverse 
from django.contrib import messages
from . import forms
from . import models
# Create your views here.

class AnnouncementListView(LoginRequiredMixin, generic.ListView):
    model = models.Announcement

class AnnouncementDetailView(LoginRequiredMixin, generic.DetailView ):
    model = models.Announcement

class AnnouncementUpdateView(LoginRequiredMixin, generic.UpdateView):
    model = models.Announcement
    form_class = forms.AnnouncementForm

class AnnouncementCreateView(LoginRequiredMixin, generic.CreateView ):
    model = models.Announcement
    form_class = forms.AnnouncementForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)

class AnnouncementDeleteView(LoginRequiredMixin, generic.DeleteView ):
    model = models.Announcement
    
    def get_success_url(self):
        return reverse('home')

    def delete(self, *args, **kwargs):
        messages.success(self.request, "Post Deleted")
        return super().delete(*args, **kwargs)
 

home app views.py :

 from django.shortcuts import render
from django.views.generic import TemplateView
# Create your views here.

class Home(TemplateView):
    template_name = 'index.html'

class BOD(TemplateView):
    template_name = 'bod.html'
 

This is what I see when I remove the a tag:
введите описание изображения здесь

Трассировка ошибок:
введите описание изображения здесь

Комментарии:

1. Нам нужно просмотреть urls.py файл, и просмотр всего сообщения об ошибке также очень поможет.

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

Ответ №1:

Похоже, что контекст должен announcement отображать эту информацию, а затем вы использовали self в url теге, который не определен.

Поэтому измените url параметр announcement.pk , который, как мы можем предположить, будет существовать, потому что это объект, используемый с этим блоком.

       <div class="card-body">
        <h5 class="card-title">{{announcement.title}}</h5>
        <p class="card-text">{{announcement.text}}</p>
        <span class="announcement-date">{{announcement.date}}</span>
        {% if user.is_authenticated %}
          <a href="{% url 'announcement:single' pk=announcement.pk %}" class="btn btn-info">Change</a>
        {% endif %}
  
      </div>
 

Комментарии:

1. По крайней мере, тогда вам нужно будет включить свое представление и URL-адреса, потому что неясно, как настроен сервер.

2. @JamesDomingo вместо announcement того, чтобы указывать в шаблоне, измените его на object , so и т.д. {{object.title}} Контекстное имя по умолчанию для объекта — object amp; на основе представлений, которыми вы поделились, вы не меняете значения по умолчанию.