【问题标题】:change django view context based on template根据模板更改 django 视图上下文
【发布时间】:2021-01-18 16:28:21
【问题描述】:

我想知道是否有办法根据模板更改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)
...

寻找更好的方法:(

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    您不需要像这样匹配相关对象,Django 可以为您完成。试试这样的:

    {% for message in chatmessages %}
        <p>{{ message.message }}</p>
        {% for img in message.multipleimage_set.all %}
            <img src="{{ img.image.url }}">
        {% endfor %}
    {% endfor %}
    

    这里我们所做的是我们使用MessageMultipleImage之间的关系从数据库中获取相关图像。
    multipleimage_set只是模型名称附加 _set 的小写字母,如果您在 ForeignKey 中设置 related_name 属性,则可以更改此属性,如下所示:

    message = models.ForeignKey('ChatMessage', on_delete=models.CASCADE, related_name='images')
    

    如果我们愿意,现在我们可以写{% for img in message.images.all %}

    【讨论】:

    • 谢谢先生,是的,它的工作就像一个魅力:)
    猜你喜欢
    • 2011-01-07
    • 2012-01-30
    • 2013-08-01
    • 2019-10-26
    • 1970-01-01
    • 2011-06-02
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多