#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
...