如何在 Django 模板中呈现查询集?
How to render out a queryset in Django templating?
我正在创建一个收件箱,登录用户可以在其中使用 Django Channels 2 查看他们的所有消息。
我想在 InboxView 中呈现查询集,以便 return 已登录用户的所有线程对象。
我的语法有问题,线程没有出现。
如果有人能帮助我,我将不胜感激。
我想在 InboxView 中呈现查询集,以便 return 已登录用户的所有线程对象。
views.py
class InboxView(LoginRequiredMixin, ListView):
template_name = 'chat/inbox.html'
def get_queryset(self):
return Thread.objects.by_user(self.request.user)
models.py
class ThreadManager(models.Manager):
def by_user(self, user):
qlookup = Q(first=user) | Q(second=user)
qlookup2 = Q(first=user) & Q(second=user)
qs =
self.get_queryset().filter(qlookup).exclude(qlookup2).distinct()
return qs
class Thread(models.Model):
first = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, related_name='chat_thread_first')
second = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, related_name='chat_thread_second')
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = ThreadManager()
def __str__(self):
return f'{self.first}'
class ChatMessage(models.Model):
thread = models.ForeignKey(Thread, null=True, blank=True,
on_delete=models.SET_NULL)
user = models.ForeignKey(settings.AUTH_USER_MODEL,
verbose_name='sender', on_delete=models.CASCADE)
message = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.id}'
inbox.html
{% for thread in object.thread_set.all?? %}
<div class="chat_list">
<h5>{{ thread.second }}<span
class="chat_date">{{ thread.timestamp }}</span></h5>
<p>{{ chat.message? }}</p>
</div>
{% endfor %}
你根本不需要那个。您的视图已经基于 Thread,因此您得到一个包含 Thread 对象查询集的 object_list
。
{% for thread in object_list %}
如果您有某个其他模型的 DetailView 并试图遵循从该对象到它的线程列表的关系,您尝试的语法会很有用。
我正在创建一个收件箱,登录用户可以在其中使用 Django Channels 2 查看他们的所有消息。
我想在 InboxView 中呈现查询集,以便 return 已登录用户的所有线程对象。
我的语法有问题,线程没有出现。
如果有人能帮助我,我将不胜感激。
我想在 InboxView 中呈现查询集,以便 return 已登录用户的所有线程对象。
views.py
class InboxView(LoginRequiredMixin, ListView):
template_name = 'chat/inbox.html'
def get_queryset(self):
return Thread.objects.by_user(self.request.user)
models.py
class ThreadManager(models.Manager):
def by_user(self, user):
qlookup = Q(first=user) | Q(second=user)
qlookup2 = Q(first=user) & Q(second=user)
qs =
self.get_queryset().filter(qlookup).exclude(qlookup2).distinct()
return qs
class Thread(models.Model):
first = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, related_name='chat_thread_first')
second = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, related_name='chat_thread_second')
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = ThreadManager()
def __str__(self):
return f'{self.first}'
class ChatMessage(models.Model):
thread = models.ForeignKey(Thread, null=True, blank=True,
on_delete=models.SET_NULL)
user = models.ForeignKey(settings.AUTH_USER_MODEL,
verbose_name='sender', on_delete=models.CASCADE)
message = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.id}'
inbox.html
{% for thread in object.thread_set.all?? %}
<div class="chat_list">
<h5>{{ thread.second }}<span
class="chat_date">{{ thread.timestamp }}</span></h5>
<p>{{ chat.message? }}</p>
</div>
{% endfor %}
你根本不需要那个。您的视图已经基于 Thread,因此您得到一个包含 Thread 对象查询集的 object_list
。
{% for thread in object_list %}
如果您有某个其他模型的 DetailView 并试图遵循从该对象到它的线程列表的关系,您尝试的语法会很有用。