django - 从一组用户中删除特定用户的对象

时间:2013-12-02 09:30:40

标签: django django-models

在我的应用程序中,用户可以通过创建新线程或可以向现有线程发送消息来在线程中发送消息。假设用户想要从特定线程中删除消息,我可以删除该消息。但我只想删除该用户的消息,而不是该线程的其他用户。这样消息只会被其他用户看到删除它的用户。我该怎么做?

models.py:

class Thread(models.Model):
    user = models.ManyToManyField(User)

class Message(models.Model):
    thread = models.ForeignKey(Thread)
    sent_date = models.DateTimeField(default=datetime.now)
    body = models.TextField()
    user = models.ForeignKey(User)

修改

message.html:

<div id="conversation">
    {% for message in messages %}
        {% if message|is_visible:request.user %}
            <div class="messages">
                <p>{{message.body}}</p>
                <p>{{message.sent_date}}</p>
                <p>-{{message.user}}</p>
                <hr>
           </div>
        {% else %}
           <div class="messages">
               <p>You have deleted this message.</p>
           </div>
        {% endif %}
    {% endfor %}
</div>

修改

templatetag:

from django import template

register = template.Library()

@register.filter
def is_visible(message, user):
    """Check the user's visibility of the message."""
    return not HideMessage.objects.filter(message=message, user=user).exists()

1 个答案:

答案 0 :(得分:3)

您实际上并不想删除邮件,而是将其隐藏在特定用户之外。执行此操作的方法可能是默认情况下所有人都可以看到您的线程/消息,但是当用户“删除”消息时,创建一个HideMessage模型或类似实例,将消息链接到用户“删除”它。然后,您可以创建一个简单的模板过滤器,根据消息检查当前登录的用户(模板中的{{ request.user }}),看看他们是否可以看到它,例如。

{% for message in messages %}
    {% if message|is_visible:user %} {# your custom filter #}
        <div class="msg visible">
            Message stuff here
        </div>
    {% else %}
        <div class="msg hidden">
            You have hidden this message!
        </div>
    {% endif %}
{% endfor %}

例如HideMessage模型可能只需要:

class HideMessage(models.Model):
    message = models.ForeignKey(Message)
    user = models.ForeignKey(User)

每当用户隐藏特定邮件时,您都会创建一个此实例,并在过滤器中检查是否存在此实例,以确定用户是否可以看到邮件。

django文档在template tags and filters上非常好,值得一读。一个非常快速的实现虽然是:

from django import template

register = template.Library()


@register.filter
def is_visible(message, user):
    """Check the user's visibility of the message."""
    return not HideMessage.objects.filter(message=message, user=user).exists()