#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'
Комментарии:
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; на основе представлений, которыми вы поделились, вы не меняете значения по умолчанию.