在Django中使用MariaDB的标签

后端开发 2026-07-08

我正在尝试做一个网站,部分功能是像这个站点那样的标签。我在尝试这个:

def index(request):
    storylist = Story.objects.order_by("id")
    tagslist = []
    for sto in storylist:
        tagslist.append(sto.tags.split(","))
    context = {"storylist": storylist,"tagslist":tagslist}
    return render(request, "storyage/index.html", context)

  1. 它不起作用(我不知道如何让特定标签随特定故事一起出现)。
  2. 删除一个故事就会把整件事弄坏。

解决方案

这里你是在 Story 模型里把标签存成一个用逗号分隔的字符串,同时又试图维护一个单独的 tagslist;但问题在于 storylisttagslist 会按位置耦合,在这种情况下,当你删除一个故事时,若你不更新 tagslist,索引就不再对齐,事情就会出错。

为了解决这个问题,特别是为了让标签管理更容易,可以创建一个单独的Tag模型,并使用ManyToManyField:

class Tag(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.name

class Story(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    tags = models.ManyToManyField(Tag, related_name='stories')
    created_at = models.DateTimeField(auto_now_add=True)

def index(request):
    storylist = Story.objects.order_by("id").prefetch_related("tags")
    context = {"storylist": storylist}
    return render(request, "storyage/index.html", context)

然后你的Django代码就会相应地看起来像这样:

{% for story in storylist %}
    <div class="story">
        <h3>{{ story.title }}</h3>
        <div class="tags">
            {% for tag in story.tags.all %}
                <span class="tag">{{ tag.name }}</span>
            {% endfor %}
        </div>
    </div>
{% endfor %}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章