如何将自定义模型管理器查询集传递给模板

时间:2019-09-10 00:50:08

标签: django django-models django-class-based-views

我正在尝试将自定义查询传递给模板,但是查询结果没有显示。

对此我有一个可行的解决方案,但我想实现一个自定义模型管理器以简化代码,但我无法完成最后一步的工作-在模板上显示结果

我有一个自定义经理:

from django.db import models


class ProfileQuerySet(models.QuerySet):
    def get_users_follows(self, user):
        print(user)
        return self.filter(followed_by__user__username=user)


class ProfileManager(models.Manager):
    def get_queryset(self):
        return ProfileQuerySet(self.model, using=self._db)

    def get_users_follows(self, user):
        return self.get_queryset().get_users_follows(user)
在模型中实例化的

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    follows = models.ManyToManyField('self', related_name='followed_by', symmetrical=False)
    objects = ProfileManager()

我的看法如下:

class FollowsListView(LoginRequiredMixin, ListView):
    # Follow.follow_data = [[],[]]
    model = Profile
    template_name = 'blog/follows.html' # <app>/<model>_<viewtype>.html

    # paginate_by = 6

    def get_queryset(self):
        follow_data = Profile.objects.get_users_follows(self.request.user)
        context = {'follow_data', follow_data}
        return context

在模板中,我这样调用follow_data:

{{ follow_data }}
    {% for p in follow_data %}
    {% if p.user %}
    <article class="media content-section">
        <img class="rounded-circle article-img" src="{{ p.user.profile.image.url }}" alt="">
        <a href="{% url 'user-posts' p.user %}">{{ p.user.profile.user }}</a>
    {% else %}
      <p>You are not following any users</p>
    {% endif %}

    </article>
    {% endfor %}

,但是没有显示任何结果,因此我不确定在这里我做错了什么。任何人都可以告诉我我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

有一个错字:

context = {'follow_data', follow_data}

您已经创建了一个集合,但是您真正想要的是一则字典

context = {'follow_data': follow_data}

编辑:

,但是无论如何您都不应该在此处返回上下文,而应该返回一个查询集。只需return follow_data就可以工作。

在模板中,您可以使用{% for user in object_list %}

引用查询集

如果您不想将其称为“ object_list”,则需要覆盖get_context_data

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["follow_data"] = context.pop("object_list")
    return context

doc:https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/#listview