Как я могу показать сообщение на домашней странице django на основе владельца сообщения

#python #django #django-rest-framework #django-views #django-templates

#python #django #django-rest-framework #django-просмотры #django-шаблоны

Вопрос:

я создаю веб-сайт blogger, у каждого пользователя есть свой собственный пост, который другой не может его видеть. я хочу показать последнее сообщение пользователя на домашней странице (index.html ).

что я пробовал, так это то, что если у пользователя уже есть сообщение, оно работает хорошо, но если у пользователя еще нет сообщения, при переходе на домашнюю страницу отображается последнее сообщение другого пользователя. как это предотвратить? я хочу, чтобы, если у пользователя еще нет сообщения, на домашней странице отображался текст, сообщающий пользователю, что у него еще нет сообщения.

вот мой код

index.html

 {% extends "blogs/base.html" %}
{% block content %}
<div class="container jumbotron p-3 p-md-5 text-white rounded bg-dark">
  <div class="col-md-6 px-0">
    {% if user.is_authenticated %}
    <h1 class="display-4 font-italic">{{ post_title }}</h1>
    <p class="lead my-3">{{texts|truncatewords:20}}</p>
    <p class="lead mb-0"><a href="#" class="text-white font-weight-bold">Continue reading...</a></p>
    <small><a href="{% url 'blogs:posts' %}" class="text-white ">See all your posts amp;raquo;</a></small>
    {%else%}
    <h1 class="display-4 font-italic">Welcome To Bogger</h1>
    <p class="lead my-3">This site is used to post your daily stories without having to worry about other people reading them.</p>
    <a class="btn-lg btn-primary" href="{% url 'users:register' %}" role="button">Register amp;raquo;</a>
    {% endif %}
  </div>
</div>
{% endblock content %}
  

views.py

 def index(request):
    """The Home Page"""
    post = BlogPost.objects.all()
    post_title = post.last()
    texts = post_title.text
    context = {'post_title': post_title, 'texts': texts}
    return render(request, 'blogs/index.html', context)
  

Ответ №1:

Насколько я понял, вы хотите показать пользователю его собственное сообщение, но в представлении домашней страницы вы просто показываете им последнее созданное сообщение, кто бы ни был пользователем, он увидит последнее сообщение, вам нужна связь с базой данных, в данном случае один ко многим (у одного пользователя много сообщений)

итак, в модели post вам нужно добавить что-то вроде:

 from django.contrib.auth.models import User
class Post(models.Model):
    ...
    user = models.ForeignKey(User, on_delete=models.CASCADE)
  

и, по вашему мнению:

  if request.user.is_authenticated:
     post=Post.objects.filter(user__pk=request.user.id).last()
     # return template with post
 else:
    # for user not authenticated
  

Я думаю, это то, что вы хотели.

Ответ №2:

Сделайте это вместо:

 def index(request):

    ...

    # query for just the logger in user's posts:
    if request.user.is_authenticated: 
        posts = request.user.posts.all() 
    
    else: 
        posts = []

    ...
  

Ответ №3:

Предполагая, что ваша BlogPost модель имеет ForeignKey

 from django.contrib.auth.models import User


class BlogPost(models.Model):
    ...

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    ...

  

Теперь измените свою index функцию примерно так

 def index(request):
    """The Home Page"""
    if request.user.is_authenticated: 
        posts = BlogPost.objects.all().filter(user__pk=request.user.id).last()
        # TO DO: What do want to pass on to the template
    else:
        posts = []
        # TO DO: Handle when posts is empty 
    # TO DO: Return to template

    ...