【问题标题】:Django iterate comma-separated list in templateDjango在模板中迭代逗号分隔的列表
【发布时间】:2014-05-14 09:35:32
【问题描述】:

我的 Django 项目有一个“标签”字段,用户可以在其中为他们的帖子添加标签。目前,这存储在我的模型中的 models.CharField(max_length=200) 字段中。

我想要做的是,当帖子显示时,每个单词都打印有自己的 URL,以便按该特定标签对帖子进行排序。例如,每个帖子还有一个“Category”models.CharField,他们可以在其中从下拉列表中选择一个类别,该下拉列表被制成帖子中的 URL。

例如在我的 Views.py 中:

@login_required
def category(request, category):
    thisuser = request.user
    if request.method == "POST":
        category = request.POST['category']
    else:
        category = ''
    following = Follow.objects.filter(follower=thisuser).order_by('-pubdate')
    followers = Follow.objects.filter(who_following=thisuser).order_by('-pubdate')

    posts = Post.objects.filter(category__contains=category)

    args = {'posts': posts, 'thisuser': thisuser, 'following': following, 'followers': followers}
    args.update(csrf(request))

    args['category'] = category

    return render_to_response('lobby.html', args)

在我的模板中:

<a href="/lobby/posts/category/{{post.category|lower}}/">Category: {{post.category}}</a>

是否有一个 {% for %} 模板标签我可以用逗号分隔标签字段中的值,然后将它们中的每一个呈现为它们自己的实例?还是我必须做其他事情,比如为标签创建一个关系数据库(因为一个帖子可以有多个标签),然后通过帖子 ID 对它们进行迭代?

【问题讨论】:

  • "是否有{% for %} 模板标签..."?好吧,you didn't look very hard
  • 我想问题是如何将它变成 django 可以迭代的列表?现在它正在将“网站,更新”之类的内容保存到该字段中,但我希望 django 将其视为一个列表,以便我可以对其进行迭代。这就是我感到困惑的地方。
  • @Two-BitAlchemist,重读整句话。他正在寻找的不仅仅是 {% for %} 标签
  • @SohanJain 我确实读了整句话。我无法说明 OP 正在寻找什么,因为缺少 Tag 的代码(它只是在某处被描述为 models.CharField),这就是我评论(未回答)的原因我能理解的部分——是否有像{% for %} 这样的模板标签可以遍历列表?是的。它在 Django 的默认标签和过滤器列表中。

标签: django


【解决方案1】:

在数据库设计方面,最好的选择是为标签提供单独的模型。这将使您更轻松地按标签搜索/排序/过滤。

但是,如果您需要快速修复,则必须将“用逗号分割”逻辑推送到您的视图/模型中,如下所示:

class Post(models.Model):
    tags = models.CharField(...)

    def split_tags(self):
        return self.tags.split(',')


# in your template:
{% for tag in post.split_tags %} {{ tag }} {% endfor %}

【讨论】:

  • 那么长期的最佳建议是创建一个标签模型,用逗号分割输入,为每个标签创建一个新的标签对象,然后使用 {%对于 %} 命令?
  • 标记会变得异常复杂,尤其是当您想按标记搜索时。您最终会希望将它们标准化(标签“UCLA”和“加州大学洛杉矶分校”是否都是同一个标签?我们如何让它们表示相同的意思?)。如果您不需要考虑这种复杂性,那么我仍然会尝试使用现有的标记库,如django-taggit,正如下面的评论所言。你会在 Post 上贴上 M2M 的标签。然后你可以说:“给我所有带有“UCLA”标签的帖子。如果没有单独的标签模型,这很困难
  • 旧帖,不过这个值得一提。非常优雅的解决方案。帮我解决了很多问题,还给了我很多关于未来事物的想法。谢谢!
【解决方案2】:

你应该做类似的事情

class Post(models.Model):
    def categories(self):
        return self.category.split(',')

然后

{% for category in post.categories %}

但我强烈建议在您的情况下使用 m2m 关系。您可以使用 django-taggit 之类的应用来帮助您。

【讨论】:

  • 如果我为标签构建了一个单独的模型,与仅使用标准 charField 并让每个标签成为自己的对象相比,让它成为 M2M 有什么优势?
  • 进行某些类型的查询更容易。假设您要检索按共有标签数量排序的相关项目。查询您的关系模型会更容易。一般来说,只要可以制作关系表,就应该这样做。
猜你喜欢
  • 2010-11-17
  • 2014-08-01
  • 2019-03-05
  • 1970-01-01
  • 2021-10-28
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多