Django Скрыть сообщения (объекты) в пользовательском интерфейсе на пользователя, не влияя на основную модель - PullRequest
1 голос
/ 24 октября 2019

У меня есть приложение, которое отображает все новостные элементы, имеющие такую ​​модель, как:

class NewsItem(models.Model):
    url = models.CharField(max_length=500, default="",unique=True)
    title = models.CharField(max_length=500, default="")
    hacker_news_url = models.CharField(max_length=500, default="")
    posted_on = models.DateTimeField(default=datetime.now)
    upvote_count = models.IntegerField(default=0)
    comment_count = models.IntegerField(default=0)

Пользовательский интерфейс: enter image description here

Я уже настроил аутентификацию django по умолчанию напросмотреть эту страницу. Пользовательский интерфейс имеет кнопку скрытия для каждого сообщения. Таким образом, проблема в , если зарегистрированный пользователь скрывает сообщение, оно должно быть скрыто только для этого пользователя (даже после обновления страницы) без удаления из NewsItem Model / Table . Как это сделать? Помогите, пожалуйста!

Это мои views.py:

@login_required(login_url='/accounts/login')
def index(request):
    context={'news_items':NewsItem.objects.all().order_by('posted_on')}
    return render(request, "hello.html", context)

1 Ответ

1 голос
/ 24 октября 2019

Вам нужно установить какое-то «Доказательство чтения» где-нибудь. Один из способов сделать это - добавить M2M между NewsItem и User моделью.

Как только пользователь нажимает «Пометить как прочитанное», вы делаете что-то вроде NewsItem.users.add(request.user), и выможете фильтровать ваш NewsItem в вашем index представлении.

class NewsItem(models.Model):
    url = models.CharField(max_length=500, default="",unique=True)
    title = models.CharField(max_length=500, default="")
    hacker_news_url = models.CharField(max_length=500, default="")
    posted_on = models.DateTimeField(default=datetime.now)
    upvote_count = models.IntegerField(default=0)
    comment_count = models.IntegerField(default=0)

    users = models.ManyToManyField('your-user-model', verbose_name="Readers", related_name="reads")

После 'makemigrations / migrate', в ваших представлениях:

@login_required(login_url='/accounts/login')$
def index(request):
    news = NewsItem.objects.exclude(users=request.user).order_by('posted_on')
    context={'news_items':news}
    return render(request, "hello.html", context)

@login_required(login_url='/accounts/login')
@require_http_methods(['POST'])
def read(request, news_item_pk):
    """
    This is the most basic example.
    If you use AJAX Calls, Do not forget to add your CSFR;
    """
    news = get_object_or_404(NewsItem, pk=news_item_pk)
    news.users.add(request.user)
    return HttpResponse()

Наконец, в ваших представлениях вы должны добавитьваш read просмотр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...