Как создать страницу для создания комментариев, относящуюся к одному сообщению в стиле блога в Django - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать страницу создания комментария, относящуюся к отдельному сообщению на сайте в стиле блога, используя Django.

На домашней странице есть список сообщений, каждая из которых снабжена кнопкой «комментарий». В идеале эта кнопка «комментарий» затем переместит вас на страницу, на которой исходный пост будет указан вверху, а форма для создания комментария - под ним.

Я пытался найти способ получить доступ к данным, которые я ищу, с помощью первичных ключей, но я не уверен, как ie все вместе.

Вот 2 модели, к которым я пытаюсь получить доступ (Post и Comment):

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=128)
    content = models.TextField()
    image = models.ImageField(upload_to='post_pics', blank=True)
    date_posted = models.DateTimeField(default=timezone.now)

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

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    comment = models.TextField()
    date_created = models.DateTimeField(default=timezone.now)

И urls.py:

from django.urls import path
from .views import PostCreateView, PostListView, VehicleListView, CommentCreateView
from . import views

urlpatterns = [
    path('', PostListView.as_view(), name='home'),
    path('comment/new/<int:pk>', CommentCreateView.as_view(), name='comment-create'),
]

Это мой текущий HTML для домашняя страница (в настоящее время добавляет идентификатор сообщения в конец HTML на связанной странице создания комментариев):

{% for post in posts %}
    <div class="infinite-item">
      <div class="card m-3">
        <div class="card-body" style="background-color:#bdcade; padding-bottom:0px">
          <div class="media mb-3">
            <img src="{{ user.profile.image.url }}" class="d-block ui-w-40 rounded-circle" style="width:40px;height:auto;" alt="">
            <div class="media-body ml-3">
              <h5 style="color:#ffffff">{{ post.user.username }}</h5>
              <div class="small text-muted">Yesterday</div>
            </div>
          </div>
        </div>

        <div class="card-body">
          <h5 class="card-title">{{ post.title }}</h5>
          <p class="card-text">{{ post.content }}</p>
          <div class="btn-group" role="group">
            <button type="button" class="btn btn-secondary">Like</button>
            <a class="btn btn-secondary" href="{% url 'comment-create' post.id %}" role="button">Comment</a>

          </div>
        </div>
      </div>
    </div>

Это мой текущий HTML для страницы создания комментариев:

{% block content %}

  <div class="card m-3">
    <div class="card-body" style="background-color:#bdcade; padding-bottom:0px">
      <div class="media mb-3">
        <img src="{{ post.user.profile.image.url }}" class="d-block ui-w-40 rounded-circle" style="width:40px;height:auto;" alt="">
        <div class="media-body ml-3">
          <h5 style="color:#ffffff">{{ post.user.username }}</h5>
          <div class="small text-muted">{{ post.title }}</div>
        </div>
      </div>
    </div>

    <div class="card-body">
      <h5 class="card-title">{{ post.title }}</h5>
      <p class="card-text">{{ post.content }}</p>
      <div class="btn-group" role="group">
        <button type="button" class="btn btn-secondary">Like</button>
        <button type="button" class="btn btn-secondary">Comment</button>
      </div>
    </div>
  </div>

  <br>
  <div class="container primary-segments">
    <form method="POST" enctype="multipart/form-data">
      {% csrf_token %}
      <fieldset>
        {{ form|crispy }}
      </fieldset>
      <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Post Comment</button>
      </div>
    </form>
  </div>

{% endblock content %}

Вот представление страницы создания комментариев (с использованием get_context_data для доступа к модели Post):

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'home/comment-form.html'
    fields = ['comment',]

    def get_context_data(self, **kwargs):
        context = super(CommentCreateView, self).get_context_data(**kwargs)
        pk = self.kwargs['pk']
        context['post'] = Post.objects.filter(id=pk)
        return context

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)

В настоящее время я не могу получить доступ к каким-либо данным для публикации на странице создания комментария. Я думаю, это связано с тем, как я пытаюсь преобразовать ie из pk в post в функции -get_context_data`. Первичный ключ для желаемого сообщения отображается в URL-адресе, просто не знаю, как получить нужные данные.

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

После долгих поисков в Google / проб и ошибок я нашел решение, которое дало мне то, что я искал.

Обновил мой View из ЭТОГО (примечание: я пытался принудительно указать c PK, чтобы проверить, будет ли он фильтровать правильные данные, но по какой-то причине я все еще не мог получить доступ что угодно):

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'home/comment-form.html'
    fields = ['comment',]

    def get_context_data(self, **kwargs):
        context = super(CommentCreateView, self).get_context_data(**kwargs)
        pk = 7
        context['post'] = Post.objects.filter(id=pk)
        return context

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)

К ЭТОМ:

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'home/comment-form.html'
    fields = ['comment',]

    def get_context_data(self, **kwargs):
        context = super(CommentCreateView, self).get_context_data(**kwargs)
        context['post'] = Post.objects.get(pk=self.kwargs['pk'])
        return context

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)

Иметь базовое c, высокоуровневое понимание того, что это делает (получение PK из URL) , но я не совсем уверен, почему исходный метод .filter() не работал.

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

Спасибо!

0 голосов
/ 16 июня 2020

Мне кажется, что вы здесь неправильно используете pk.

pk в этом сегменте кода здесь:

def get_context_data(self, **kwargs):
        context = super(CommentCreateView, self).get_context_data(**kwargs)
        pk = self.kwargs['pk']

- это pk из comment, однако вы пытаетесь использовать его для поиска Post с context['post'] = Post.objects.filter(id=pk). Помните, что pk обозначает primary key и ссылается на объект, который вы объявили как model для вашего представления. Если вы хотите, чтобы Post был связан с этим Comment, вам нужно будет найти его, используя Comment.post, поскольку это объявленный внешний ключ внутри вашей модели.

...