在Django中使用MariaDB的标签
我正在尝试做一个网站,部分功能是像这个站点那样的标签。我在尝试这个:
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)
但
- 它不起作用(我不知道如何让特定标签随特定故事一起出现)。
- 删除一个故事就会把整件事弄坏。
解决方案
这里你是在 Story 模型里把标签存成一个用逗号分隔的字符串,同时又试图维护一个单独的 tagslist;但问题在于 storylist 和 tagslist 会按位置耦合,在这种情况下,当你删除一个故事时,若你不更新 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。