2013-12-02 3 views
2

В моем приложении пользователь может отправлять сообщение в потоке, создавая новый поток или может сообщать существующий поток. Предположим, что пользователь хочет удалить сообщение из определенного потока, возможно, я удалю сообщение. Но я просто хочу удалить сообщение для этого пользователя, а не для других пользователей этого потока. Чтобы сообщение отображалось только другим пользователям, другим пользователям, которые его удалили. Как мне это сделать?django - удаление объекта для определенного пользователя из группы пользователей

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) 

Edit:

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> 

Edit:

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() 

ответ

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() 
+0

Do, я создаю новую модель класса, чтобы это удержать? – Aamu

+0

да, см. Обновление – ptr

+0

Большое вам спасибо! Но я не так хорошо знаком с тегами шаблонов ... Не могли бы вы любезно показать мне, как это будет. Спасибо. – Aamu

Смежные вопросы