打开邮件时,将BooleanField从False更改为True

时间:2018-06-07 21:17:35

标签: python django

我在Django框架上创建了自己的消息引擎,让用户向对方发送消息,这是我的消息模型

models.py

class Message(models.Model):
    sender = models.ForeignKey(UserModel, related_name="sender", on_delete='CASCADE')
    receiver = models.ForeignKey(UserModel, related_name="receiver", on_delete='CASCADE')
    msg_title = models.CharField(max_length=150, verbose_name='عنوان الرسالة', default='رسالة جديدة من مستخدم فوستانيا')
    msg_content = models.TextField(max_length=1200,verbose_name='محتوى الرسالة')
    created_at = models.DateTimeField(auto_now=True)
    read = models.BooleanField(default=False)

然后我列出了用户的消息,他们可以看到带有read = False的消息作为新消息,他们可以点击它来查看完整的消息,我希望在用户之后将读取状态更改为True点击模板中的消息,怎么做!

urls.py

path('messages/', views.messages, name="messages"),
path('messages/<int:pk>/', views.message_page, name="message_page"),

views.py

@login_required
def messages(request):
    inbox = Message.objects.filter(receiver=request.user, read=True)
    context = {
        'inbox': inbox,
    }
    return render(request, 'fostania_web_app/messages.html', context)


def message_page(request, pk):
    current_msg = get_object_or_404(Message, pk=pk)

    context = {
        'current_msg': current_msg,
    }
    return render(request, 'fostania_web_app/message_page.html', context)

邮件列表模板 message.html

{% extends 'fostania_web_app/base.html' %}
{% block content %}
{% load static %}
                        {% if user.is_authenticated %}
<br><br>
<div class="card text-white bg-warning mb-3" style="max-width: 75rem;" align="right">
  <div class="card-header">رسائل جديدة  </div>
  <div class="card-body">
    <p class="card-text">
    {% if new_messages.count != 0  %}
        {% for msg in new_messages %}
            <a href="{% url 'message_page' msg.pk%}"><img src="{% static 'img/new-msg.png' %}"> {{ msg.msg_title }}</a>
            <br>
        {% endfor %}
        {% else %}
        لا توجد رسائل غير مقروءة
        {% endif %}
    </p>
  </div>
</div>
                            <!-- old msgs -->
<div class="card text-dark bg-ligh mb-3" style="max-width: 75rem;" align="right">
  <div class="card-header"><img src="{% static 'img/inbox.png' %}">  صندوق الوارد </div>
  <div class="card-body">
    <p class="card-text">
        {% for msg in inbox %}
            <a href="{% url 'message_page' msg.pk%}"><img src="{% static 'img/old-msg.png' %}"> {{ msg.msg_title }}</a><br>
        {% endfor %}

    </p>
  </div>
</div>


    {% else %}
    يتوجب عليك تسجيل الدخول اولاً
    {% endif %}

{% endblock %}

点击并传递消息正文

message_page.html

{% extends 'fostania_web_app/base.html' %}
{% block content %}
{% load static %}
<Br><br>
<div class="card bg-light mb-3" style="max-width: 50rem;" align="right ">
  <div class="card-header">{{ current_msg.sender.name }}</div>
  <div class="card-body">
    <h5 class="card-title">{{ current_msg.msg_title }}</h5>
    <p class="card-text">{{ current_msg.msg_content }}
    <Br><br>
    <button class="btn btn-success">إرسـال رد</button>&nbsp;
        <a href="{% url 'messages' %}"><button class="btn btn-danger">رجوع للرسائل </button></a>
    </p>
  </div>
</div>

{% endblock %}

1 个答案:

答案 0 :(得分:2)

只需更新正在阅读的邮件即可避免太多工作:

def message_page(request, pk):
    current_msg = get_object_or_404(Message, pk=pk)
    current_msg.read = True
    current_msg.save()

    context = {
        'current_msg': current_msg,
    }
    return render(request, 'fostania_web_app/message_page.html', context)

奖金:

而不是

{% if new_messages.count != 0  %}
    {% for msg in new_messages %}
        ''' '''
    {% endfor %}
{% else %}
    لا توجد رسائل غير مقروءة
{% endif %}

在循环内部,您可以检查是否读取了msg,而不是再发送一个查询集,因此您只需执行

{% for msg in new_messages %} # instead of new_messages, send all_messages
      {% if msg.read %}
          ''' old message '''
      {% else %}
          ''' new message '''
      {% endif %}
{% empty %}
   لا توجد رسائل غير مقروءة # don't really know what does that mean
{% endfor %}