如何将自定义模型管理器查询集传递给模板
How to pass a custom model manager queryset to a template
我正在尝试将自定义查询传递给模板,但未显示查询结果。
我有一个可行的解决方案,但我想实现一个自定义模型管理器来简化代码,但我无法完成最后一步工作 - 即在模板上显示结果
我有一个自定义管理器:
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 %}
但是没有显示任何结果,所以我不太确定我在这里做错了什么。任何人都可以快速指出我做错了什么吗?
有一个错字:
context = {'follow_data', follow_data}
你已经创建了一个集合,但你真正想要的是一个字典
context = {'follow_data': follow_data}
编辑:
但无论如何您都不应该 return 在此处设置上下文,您应该 return 查询集。简单地做 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
文档:https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/#listview
我正在尝试将自定义查询传递给模板,但未显示查询结果。
我有一个可行的解决方案,但我想实现一个自定义模型管理器来简化代码,但我无法完成最后一步工作 - 即在模板上显示结果
我有一个自定义管理器:
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 %}
但是没有显示任何结果,所以我不太确定我在这里做错了什么。任何人都可以快速指出我做错了什么吗?
有一个错字:
context = {'follow_data', follow_data}
你已经创建了一个集合,但你真正想要的是一个字典
context = {'follow_data': follow_data}
编辑:
但无论如何您都不应该 return 在此处设置上下文,您应该 return 查询集。简单地做 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
文档:https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/#listview