我试图遍历一个对象并存储并将结果存储在一个列表中,这样我就可以在我的django模板中使用它并显示它。我试图复制我在代码中的其他地方的东西,以满足我的需要,但它不起作用。我试图复制这个
{% for tag in instance.tags.all %}
{{ tag.post_set.all }}
{% endfor %}
这将返回一个块中的所有内容。我希望能够遍历它,所以我尝试了这个
links = []
for t in tag:
links.append(
t.post_set.all()
)
mylink = links
context = {
"title": "detail ",
"instance": instance,
"hops": mylink
}
但它没有用。什么是正确的语法从循环中撕下我的结果并将它们存储在我可以在我的模板中使用的列表中。欢迎提供所有帮助或建议
编辑:
我的观点
def post_detail(request, slug=None):
instance = get_object_or_404(Post, slug=slug)
tag = instance.tags.all
links = []
for t in tag:
links.append(
t.post_set.distinct()
)
share_string = quote_plus(instance.content)
tag = instance.tags.all()
context = {
"title": "detail ",
"instance": instance,
"share_string": share_string,
"tag": tag
}
return render(request, "posts/post_detail.html", context)
class Tag(models.Model):
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=200, unique=True)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("posts:tag_index", kwargs={"slug": self.slug})
class Meta:
ordering = ["-timestamp"]
class Post(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
slug = models.SlugField(unique=True)
title = models.CharField(max_length=120)
image = models.ImageField(upload_to=upload_location, null=True, blank=True,
width_field="width_field",
height_field="height_field")
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
content = models.TextField()
draft = models.BooleanField(default=False)
publish = models.DateField(auto_now=False, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
tags = models.ManyToManyField(Tag)
objects = PostManager()
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("posts:detail", kwargs={"slug": self.slug})
class Meta:
ordering = ["-timestamp"]
def create_slug(instance, new_slug=None):
slug = slugify(instance.title)
if new_slug is not None:
slug = new_slug
qs = Post.objects.filter(slug=slug).order_by("-id")
exists = qs.exists()
if exists:
new_slug = "%s-%s" % (slug, qs.first().id)
return create_slug(instance, new_slug=new_slug)
return slug
def pre_save_post_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
pre_save.connect(pre_save_post_receiver, sender=Post)
这就是我所拥有的
答案 0 :(得分:2)
为什么模板中没有内循环:
{% for tag in instance.tags.all %}
{% for post in tag.post_set.all %}
{{ post }}
{% endfor %}
{% endfor %}
答案 1 :(得分:1)
我会再次提出答案。 alecxe's answer具有正确的模板语法。
您应该尝试最小化模板中发生的业务逻辑,因为渲染性能已经足够糟糕了。将不同的逻辑移动到Python代码中。 使用distinct()可能会为您解决问题
links = []
for t in tag:
links.append(
t.post_set.distinct()
)
保持模板逻辑基本
只需直接从模型访问和存储标记,然后在上下文中返回它们。如果我没有弄错的话,instance.tags 应返回查询集,这意味着您只需在标记上调用distinct()即可。
def post_detail(request, slug=None):
instance = get_object_or_404(Post, slug=slug)
tags = instance.tags.distinct()
share_string = quote_plus(instance.content)
context = {
"title": "detail ",
"instance": instance,
"share_string": share_string,
"tags": tags
}
return render(request, "posts/post_detail.html", context)
您的模板应该是:
{% for tag in tags %}
{{ tag }}
{% endfor %}
答案 2 :(得分:0)
最好对您想要的帖子进行单一查询。
links = Post.objects.filter(link__tag__instancemodel=instance)
其中instancemodel
是任何模型instance
的名称。