Невозможно отобразить содержимое страницы в Django
Существует приложение posts. Существует модель:
class Post(models.Model):
text = models.TextField()
pub_date = models.DateTimeField("date published", auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
group = models.ForeignKey(Group, on_delete=models.SET_NULL, related_name="posts", blank=True, null=True)
def __str__(self):
# выводим текст поста
return self.text
Есть урлы:
path('posts/<str:username>/<int:post_id>/', views.post_view, name='post'),
Существует мнение:
@login_required
def post_edit(request, username, post_id):
post = get_object_or_404(Post, pk=post_id, author__username=username)
print(post.text)
if request.user != post.author:
return redirect('post', username=username, post_id=post_id)
form = PostForm(request.POST or None, instance=post)
if form.is_valid():
form.save()
return redirect('post', username=username, post_id=post_id)
return render(request, 'post_new.html', {'form': form, 'post': post})
При проверке здесь в Views все отображается правильно: print(post.text). Однако на HTML-странице ничего не работает?
Есть HTML:
<main role="main" class="container">
<div class="row">
<div class="col-md-12">
<div class="card mb-3 mt-1 shadow-sm">
<div class="card-body">
<p class="card-text">
<a href="{% url 'profile' user.username %}">
<strong class="d-block text-gray-dark">@{{ post.author.username }}</strong>
</a>
{{ post.text }}
</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<p>Author: {{ post.author.get_full_name }}</p>
<p>ID: {{ post.author.username }}</p>
</div>
<small class="text-muted">{{ post.pub_date }}</small>
</div>
</div>
</div>
</div>
</div>
</main>
В чем проблема. Здесь ничего не работает? post.pub_date, post.author.get_full_name... Почему это работает в контексте:
{% for post in posts %}
....
{{post.text}}
...
Работает через {{ posts.0.author.username }}. Но не работает: {{ post.author.username }}.
Что я делаю не так?
Если вы используете Modelmame.Objects.filter
для создания контекстной переменной posts
, она (posts
) станет списком. Поэтому необходимо использовать следующий синтаксис.
{% for p in posts %}
{{p.text}}
{% endfor %}
Если вы используете Modelmame.Objects.get
для генерации posts
контекстной переменной, она (posts
) станет одним объектом. Поэтому необходимо использовать следующий синтаксис.
{{posts.text}}