【问题标题】:How to delete post and delete tag which will be unused on Django2.2 using django-taggit如何使用 django-taggit 删除将在 Django2.2 上未使用的帖子和删除标签
【发布时间】:2019-11-14 19:39:34
【问题描述】:

我正在制作一个使用 django 和 django-taggit 的 blogapp。我使用django.views.generic.edit.DeleteView 做了一个删除视图。但是当我看到管理页面时,帖子被删除了,但标签没有。如何删除帖子并同时删除将不使用的标签?

这是我尝试过的代码。 如果你删除delete函数,它只会删除帖子。

views.py

class DeleteView(LoginRequiredMixin, generic.edit.DeleteView):
    model = Post
    success_url = reverse_lazy('portal:index')

    def delete(self, request, *args, **kwargs):
        deltag = self.object.tags.clear()
        result = super().delete(request, *args, **kwargs)
        return deltag,result

models.py

from django.db import models
from django.urls import reverse
from taggit.managers import TaggableManager

class Post(models.Model):


    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    tags = TaggableManager(blank=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('portal:index')

【问题讨论】:

  • 帖子和标签之间有什么关系,你能用模型更新问题吗?如果 Tag 有 ForeignKey to Post,则可以在定义字段时使用 on_delete=models.CASCADE

标签: django python-3.x django-taggit


【解决方案1】:

我不相信您可以删除与 Post 相关的标签,因为另一个 Post 也可能使用其中一些标签。

您可以做的是删除不再使用的Tags:

from taggit.models import Tag

class DeleteView(LoginRequiredMixin, generic.edit.DeleteView):
    model = Post
    success_url = reverse_lazy('portal:index')

    def delete(self, request, *args, **kwargs):
        result = super().delete(request, *args, **kwargs)
        Tag.objects.filter(post=None).delete()
        return result

但请注意,标签通常不仅用于一个模型(如Post),而且用于多个模型。因此,通过Post 模型删除未使用的标签可能不是一个好主意,因为CommentProduct 等仍然可以使用给定的标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2019-01-17
    相关资源
    最近更新 更多