[英]Can't Edit and Delete posts from my Django post_detail.html template
我在 post_details.html 中添加了编辑和删除按钮。 这是编辑或删除帖子所有者添加的帖子。 不幸的是,我在访问 post_details.html 页面时总是遇到错误。
错误是:
NoReverseMatch at /2020/10/31/django-framework Reverse for 'post_update' with arguments '(14,)' not found. 尝试了 1 个模式:['(?P[0-9]+)/(?P[0-9]+)/(?P[0-9]+)/(?P[-a-zA -Z0-9_]+)/(?P[0-9]+)/update$']
拜托我需要你的帮忙...
下面是代码片段:
模型.py
class PublishedManager(models.Manager):
def get_queryset(self):
return super(PublishedManager, self).get_queryset(). \
filter(status='published')
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250,
unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE,
related_name='blog_posts')
header_image = models.ImageField(null=True, blank=True, upload_to='post')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10,
choices=STATUS_CHOICES, default='published')
objects = models.Manager() # Default manager
published = PublishedManager() # Custom manager
tags = TaggableManager()
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('blog:post_detail',
args=[self.publish.year,
self.publish.month,
self.publish.day,
self.slug])
def save(self, *args, **kwargs): # new
if not self.slug:
self.slug = slugify(self.title)
return super().save(*args, **kwargs)
视图.py
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
fields = ['title', 'body', 'tags', 'status']
template_name = 'blog/post/post_form.html'
def form_valid(self, form):
form.instance.author = self.request.user
return super(PostUpdateView, self).form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Post
template_name = 'blog/post/post_confirm_delete.html'
success_url = '/'
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
网址.py
from django.urls import path
from . import views
from .views import PostCreateView, PostUpdateView, PostDeleteView
app_name = 'blog'
urlpatterns = [
# Post views
path('', views.post_list, name='post_list'),
path('<int:year>/<int:month>/<int:day>/<slug:post>', views.post_detail, name='post_detail'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/<int:id>/update', PostUpdateView.as_view(), name='post_update'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/<int:id>/delete', PostDeleteView.as_view(), name='post_delete'),
post_detail.html
{% if post.author == user %}
<div>
<a class="btn btn-secondary btn-sm mt-1 mb-3"
href="{% url 'blog:post_update' post.id %}">Edit</a>
<a class="btn btn-danger btn-sm mt-1 mb-3"
href="{% url 'blog:post_delete' post.id %}">Delete</a>
</div>
{% endif %}
主要项目网址
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls', namespace='blog')),
]
{% if post.author == user %}
<div>
<a class="btn btn-secondary btn-sm mt-1 mb-3"
href="{% url 'blog:post_update' post.id %}">Edit</a>
<a class="btn btn-danger btn-sm mt-1 mb-3"
href="{% url 'blog:post_delete' post.id %}">Delete</a>
</div>
{% endif %}
更正的代码
{% if post.author == user %}
<div>
<a class="btn btn-secondary btn-sm mt-1 mb-3"
href="{% url 'blog:post_update' post.year post.month post.day post.slug post.id %}">Edit</a>
<a class="btn btn-danger btn-sm mt-1 mb-3"
href="{% url 'blog:post_delete' post.year post.month post.day post.slug post.id %}">Delete</a>
</div>
{% endif %}
传递适当的值,如年、月、日、slug.... 或在您的 url 中删除它...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.