python - 根据模板更改 django 视图上下文
问题描述
我想知道是否有办法django view
根据模板更改上下文(我不知道是否可能)
我正在构建一个聊天应用程序,在其中循环遍历所有线程消息,并且循环遍历所有图像,如果图像消息 id 等于消息 id 以显示与消息相关的图像。是这样的
..
{% for message in chatmessages %}
<p>{{ message.message }}</p>
{% for img in images %}
{% if img.message.id == message.id %}
<img src="{{ img.image.url }}">
{% endif %}
{% endfor %}
{% endfor %}
附件也是如此。我从我的角度发送这些上下文
context = {
"me": me,
"threads": threads,
"other_user": other_user,
"chatmessages": ChatMessage.objects.filter(thread=thread.id),
"images": MultipleImage.objects.all(),
"attachments": MultipleAttchment.objects.all(),
}
有什么更好的方法来减少我在模板中的循环以获得更好的功能!?这是我的models.py
...
class ChatMessage(models.Model):
thread = models.ForeignKey(Thread, null=True, blank=True, on_delete=models.SET_NULL)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
message = models.TextField(null=True)
timestamp = models.DateTimeField(auto_now_add=True)
voice = models.FileField(upload_to=upload_voice_dir, blank=True, null=True)
class MultipleImage(models.Model):
message = models.ForeignKey('ChatMessage', on_delete=models.CASCADE)
image = models.ImageField(upload_to=upload_img_dir, blank=True, null=True)
class MultipleAttchment(models.Model):
message = models.ForeignKey(ChatMessage, on_delete=models.CASCADE)
attachment = models.FileField(upload_to=upload_att_dir, blank=True, null=True)
...
寻找更好的方法:(
解决方案
您不需要像这样匹配相关对象,Django 可以为您完成。尝试这样的事情:
{% for message in chatmessages %}
<p>{{ message.message }}</p>
{% for img in message.multipleimage_set.all %}
<img src="{{ img.image.url }}">
{% endfor %}
{% endfor %}
在这里,我们所做的是使用 和 之间的关系Message
从MultipleImage
数据库中获取相关图像。
multipleimage_set只是附加了_set的小写模型名称,如果您在 ForeignKey 中设置related_name属性,则可以更改它,如下所示:
message = models.ForeignKey('ChatMessage', on_delete=models.CASCADE, related_name='images')
现在我们可以写{% for img in message.images.all %}
,如果我们愿意。
推荐阅读
- spring - Spring 为每个 POST 请求创建唯一的 @Component
- swift - Use type of Self in overrides
- javascript - axios , login with api , handle token
- c# - How to handle security pop-up in outlook using C#
- c# - 在 Visual Studio 中删除当前文件的快捷方式
- c# - CORS issue with port
- swift - 与协议的一致性冲突 - 最佳实践
- python - 在 Python 中以字典形式返回结果的函数
- excel - Telerik RadGridView.ExportToXlsx - 将单元格格式化为数字
- sql-server - 在 where 子句中使用自联接和 group bys 优化查询