博客/ urls.py
#from django.contrib import admin
from django.urls import path,re_path
from . import views
app_name='blog'
urlpatterns =[
path('about/',views.AboutView.as_view(),name='about'),
path('',views.PostListView.as_view(),name='post_list'),
path('post/(?P<pk>\d+)/$',views.PostDetailView.as_view(),name='post_detail'),
path('post/new',views.CreatePostView.as_view(),name='post_new'),
re_path('post/(?P<pk>\d+)/edit/',views.PostUpdateView.as_view(),name='post_edit'),
re_path('post/(?P<pk>\d+)/remove/',views.PostDeleteView.as_view(),name='post_remove'),
path('drafts/',views.DraftListView.as_view(),name='post_draft_list'),
re_path('post/(?P<pk>\d+)/comment/',views.add_comment_to_post,name='add_comment_to_post'),
re_path('comment/(?P<pk>\d+)/remove/',views.comment_remove,name='comment_remove'),
re_path('post/(?P<pk>\d+)/publish/',views.post_publish,name='post_publish'),
re_path('comment/(?P<pk>\d+)/approve/', views.comment_approve, name='comment_approve'),
]
views.py
from django.shortcuts import render,get_object_or_404,redirect
from django.utils import timezone
from blog.models import Comment,Post
from blog.forms import CommentForm,PostForm
from django.urls import reverse_lazy
from django.contrib.auth import authenticate, login
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.views.generic import (TemplateView,
ListView,DetailView,CreateView,UpdateView)
class AboutView(TemplateView):
template_name = 'about.html'
class PostListView(ListView):
model = Post
def get_queryset(self):
return
Post.objects.filter(published_date__lte=timezone.now()).order_by('-
published_date')
class PostDetailView(DetailView):
model = Post
class CreatePostView(LoginRequiredMixin,CreateView):
login_url='/login/'
redirect_field_name='blog/post_detail.html'
form_class = PostForm
model=Post
class PostUpdateView(LoginRequiredMixin,UpdateView):
login_url='/login/'
redirect_field_name='blog/post_detail.html'
form_class = PostForm
model=Post
class PostDeleteView(LoginRequiredMixin,DetailView):
model=Post
success_url = reverse_lazy('post_list')
class DraftListView(LoginRequiredMixin,ListView):
login_url = '/login/'
redirect_field_name = 'blog/post_list.html'
model = Post
def get_queryset(self):
return Post.objects.filter(
published_date__isnull=True).order_by ('created_date')
@login_required
def add_comment_to_post(request,pk):
post=get_object_or_404(Post,pk=pk)
if request.method =='POST':
form=CommentForm(request.POST)
if form.is_valid():
comment=form.save(commit=False)
comment.post=post
comment.save()
return redirect('post_detail',pk=post.pk)
else:
form=CommentForm()
return render(request,'blog/comment_form.html',{'form':form})
@login_required
def comment_approve(request,pk):
comment = get_object_or_404(Comment,pk=pk)
comment.approve()
return redirect('post_detail',pk=comment.post.pk)
@login_required
def comment_remove(request,pk):
comment = get_object_or_404(Comment,pk=pk)
post_pk = comment.post.pk
comment.delete()
return redirect('post_detail',pk=post_pk)
@login_required
def post_publish(request,pk):
post = get_object_or_404(Post,pk=pk)
post.publish()
return redirect('post_detail',pk=pk)
post_detail.html
{% extends 'blog/base.html' %}
{% block content %}
<h1 class='posttitle loader'>{{ post.title }}</h1>
{% if post.published_date %}
<div class="date postdate">
{{ post.published_date }}
</div>
{% else %}
<a class="btn btn-default" href="{% url 'post_publish' pk=post.pk %}">Publish</a>
{% endif %}
<p class='postcontent' >{{ post.text|safe|linebreaksbr }}</p>
{% if user.is_authenticated %}
<a class="btn btn-primary" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
<a class="btn btn-primary" href="{% url 'post_remove' pk=post.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
{% endif %}
<hr>
<a class="btn btn-primary btn-comment" href="{% url 'add_comment_to_post' pk=post.pk %}">Add comment</a>
<div class="container">
{% for comment in post.comments.all %}
<br>
{% if user.is_authenticated or comment.approved_comment %}
{{ comment.created_date }}
{% if not comment.approved_comment %}
<a class="btn btn-default" href="{% url 'comment_remove' pk=comment.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
<a class="btn btn-default" href="{% url 'comment_approve' pk=comment.pk %}"><span class="glyphicon glyphicon-ok"></span></a>
{% endif %}
<p>{{ comment.text|safe|linebreaks }}</p>
<p>Posted by: <strong>{{ comment.author }}</strong></p>
{% endif %}
{% empty %}
<p>No comments posted.</p>
{% endfor %}
</div>
{% endblock %}
When I click on save button it gives me error
models.py error
self.published_date=timezone.now()
self.save()
def approve_comments(self):
return self.comments.filter(approved_comments=True)
**def get_absolute_url(self):
return reverse("post_detail",kwargs={'pk':self.pk})** ...
def __str__(self):
return self.title
NoReverseMatch at /post/new
Reverse for 'post_detail' not found. 'post_detail' is not a valid view function or pattern name.
答案 0 :(得分:0)
urls.py
from django.contrib import admin
from django.urls import path,include
from blog import views
from django.contrib.auth import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('blog.urls')),
path('accounts/login/', views.login, name='login'),
path('accounts/logout/', views.logout, name='logout', kwargs={'next_page': '/'}),
]
答案 1 :(得分:0)
在您的项目网址中 path('',include('blog.urls',namespace =“ blog”)))
使用模板标记时添加包含的名称空间...
答案 2 :(得分:0)
def get_absolute_url(self):
return reverse("blog:post_detail",kwargs={'pk':self.pk})*