【问题标题】:Can't Edit and Delete posts from my Django post_detail.html template无法从我的 Django post_detail.html 模板中编辑和删除帖子
【发布时间】:2020-10-31 18:03:44
【问题描述】:

我在 post_details.html 中添加了编辑和删除按钮。这是编辑或删除帖子所有者添加的帖子。很遗憾,我在访问 post_details.html 页面时总是遇到错误。

错误是:

NoReverseMatch 在 /2020/10/31/django-framework 未找到带有参数“(14,)”的“post_update”的反向操作。尝试了 1 种模式:['(?P[0-9]+)/(?P[0-9]+)/(?P[0-9]+)/(?P[-a-zA -Z0-9_]+)/(?P[0-9]+)/update$']

我需要你的帮助...

下面是sn-ps的代码:

models.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)

views.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 

urls.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')),
]

【问题讨论】:

  • 不需要在 url 参数中添加年月日。帖子的 id 是唯一的,因此所有这些值都会使您的逻辑、代码库复杂化并延长 url。我建议你删除它。
  • 好吧,我会这样做
  • 非常感谢。我删除了日期,现在一切正常。

标签: python django url django-models django-views


【解决方案1】:
 {% 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 中删除它...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多