Как отобразить пост и связанные комментарии на одной странице? - PullRequest
0 голосов
/ 02 июля 2019

Я не могу разработать код для отображения одного конкретного сообщения и связанных с ним комментариев.Проблема может быть в views.py или в URL.

Я просмотрел несколько источников без каких-либо результатов.Я новичок в кодировании и чувствую, что упускаю какой-то важный момент.Посты и комментарии создаются правильно, и все комментарии получают правильный post_id.

Мой models.py настроен так:

class Post(models.Model):
title = models.CharField(max_length=1000)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('blog-home')

class Comment(models.Model):
cid = models.AutoField(primary_key=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
comment = models.TextField()
comment_date = models.DateTimeField(default=timezone.now)

def save(self, *args, **kwargs):
    super(Comment, self).save(*args, **kwargs)

def __str__(self):
    return self.comment


def get_absolute_url(self):
    return reverse('blog-home')

Мой views.py настроен так:

class PostDetailView(DetailView):
model = Post

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['comment_list'] = Comment.objects.filter(post=WHAT SHOULD GO HERE?)
    return context

Мне нужно пройти сообщение.id или первичный ключ сообщения в фильтре выше.Может кто-нибудь объяснить, что это должно быть?

URL-адрес, используемый для доступа к деталям публикации, выглядит следующим образом:

path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail')

Я получаю представление сведений о сообщении в виде автора, заголовка и содержания.сообщения, когда у меня есть следующее в views.py:

class PostDetailView(DetailView):
model = Post

Шаблон для этого, как показано ниже:

{% extends "blog/base.html" %}
{% block content%}
	
<article class="media content-section">
		<img class="rounded-circle article-img" src="{{object.author.profile.image.url}}">
		  <div class="media-body">
		    <div class="article-metadata">
		      <a class="mr-2" href="{% url 'user-posts' object.author.username %}">{{ object.author }}</a>
		      <small class="text-muted">{{ object.date_posted|date:"F d, Y P e" }}</small>
		      {% if object.author == user %}
		      <div><a class="btn btn-secondary btn-sm m-1 mb-1" href="{% url 'post-update' object.id%}">Update</a>
		      <a class="btn btn-danger btn-sm m-1 mb-1" href="{% url 'post-delete' object.id%}">Delete</a></div>
		      
		      {% endif %}
		    </div>
		    <h2 class="article-title">{{ object.title }}</h2>
		    <p class="article-content">{{ object.content }}</p>
		  </div>
</article>
{% for comment in comment_list %}
<div class='article-content'>
	<p>{{comment}}</p>
</div>
{% endfor %}
	
{% endblock %}

Как мне взять post.id или pk сообщения и использовать его для фильтрации комментариев, относящихся только к этому конкретному сообщению?

Кроме того,Как правильно настроить шаблон для рендеринга набора запросов?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы должны иметь возможность перебирать обратную ссылку от Post объекта к Comment объектам, связанным с ним (по умолчанию comment_set) в вашем шаблоне:

{% for comment in post.comment_set %}

Если вы хотите большего контроля, вы вводите набор запросов в контекст, что-то вроде этого, чтобы получить только самые последние шесть комментариев.

"comments": post.comment_set.order_by("-comment_date")[:6]

Выбранный объект записи должен быть доступен как self.object в DetailView и по умолчанию будет вставлен в контекст рендеринга как object. Бесценным ресурсом для навигации по структуре представлений на основе класса Django является Classy CBV сайт.

Предупреждение: это "с моей головы", поэтому не думайте, что все идеально.

0 голосов
/ 03 июля 2019

Один объект будет иметь доступ к связанным объектам. Попробуйте это:

class PostDetailView(DetailView):
    model = Post

    # There's no need to define get_context_data() here

Теперь ваш шаблон будет иметь пост, доступный как post (а также object). Все комментарии, которые имеют этот post доступны в шаблоне, как это:

{% for comment in post.comment_set.all %}
    <div class='article-content'>
        <p>{{ comment }}</p>
    </div>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...