Django新手在这里......
我有三种模型,我目前正在努力解决这个模型,并获得了理想的解决方案。但是,解决方案当然不是有效的,也不是良好的做法。我只是不知道足以实现我想要的东西。
以下是模型......
基础/ models.py
class Tag(models.Model):
slug = models.SlugField(max_length=200, unique=True)
def __unicode__(self):
return self.slug
def get_absolute_url(self):
return reverse("tag_index", kwargs={"slug": self.slug})
class post(models.Model):
title = models.CharField(max_length = 180)
// a bunch of other fields here
tags = models.ManyToManyField(Tag)
def get_absolute_url(self):
return reverse("post_detail", kwargs={"slug": self.slug})
def __unicode__(self):
return self.title
class Meta:
verbose_name = "Blog Post"
verbose_name_plural = "Blog Posts"
ordering = ["-created"]
项目/ models.py
class project(models.Model):
projectTitle = models.CharField(max_length=150, null=False)
projectTag = models.OneToOneField(Tag, primary_key=True)
description = MarkdownField()
def __unicode__(self): # __unicode__ on Python 2
return self.projectTitle
class Meta:
verbose_name = "Project"
verbose_name_plural = "Projects"
现在......我想要做的是创建一个足够的视图,该视图仅将标记有项目标签的帖子传递给我的模板,而不是当前所有的帖子。
项目/ views.py
class projectFeed(generic.ListView):
queryset = project.objects.all()
template_name = "projects.html"
paginate_by = 5
def get_context_data(self, **kwargs):
context = super(projectFeed, self).get_context_data(**kwargs)
# slug = self.kwargs['projectTag']
# tag = Tag.objects.get(slug=slug)
context['posts'] = post.objects.all()#filter(tags=tag)
return context
正如您所看到的,我尝试了一些用于创建视图的内容,以显示具有特定标记的所有帖子,但我无法在此处使用。
项目/模板/ projects.html
{% for project in project_list %}
<div class='postContent'>
<!-- project stuff here -->
{% for post in posts %}
{% if project.projectTag in post.tags.all %}
<p><a href="{% url 'post_detail' slug=post.slug %}"> {{ post.title }} </a></p>
{% endif %}
{% endfor %}
</div>
{% endfor %}
理想情况下......我想传递一个嵌套的排序列表,其中project
中的每个project_list
都有一个相关的帖子列表,我可以在内部for循环中迭代而无需检查标签。也就是说,我想在视图方法/类或其他更有效的地方过滤和排列数据。
答案 0 :(得分:1)
您可以使用下一个相关经理获取相关帖子的列表: posts = project.projectTag.post_set.all() 为什么不尝试在模板中使用它
{% for project in project_list %}
<!-- project stuff hete -->
{% for post in project.projectTag.post_set.all %}
<!-- post stuff goes here -->
{% endfor %}
{% endfor %}
但是为了减少sql查询的数量,你必须覆盖ListFilter的get_queryset方法:
def get_queryset(self):
return super(projectFeed, self).get_queryset()
.select_related('projecttag')
.prefetch_related('projecttag__post_set')