Django не может создавать или отображать комментарии - PullRequest
1 голос
/ 15 марта 2020

Привет, у меня есть эта структура для обработки сообщений и комментариев пользователей
enter image description here

моя модель сообщений

 from django.db import models
    from django.contrib.auth.models import User


    class Post(models.Model):


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


       profile = models.ForeignKey('users.Profiles', on_delete=models.CASCADE, null=True, default=1, blank=True)
       title = models.CharField(max_length=100, blank=True, null=True)
       desc = models.CharField(max_length=1000, blank=True, null=True)

       photo = models.ImageField(upload_to='posts/photos')

       created = models.DateTimeField(auto_now_add=True)
       modified = models.DateTimeField(auto_now=True)


       def __str__(self):
            return '{} by {}'.format(self.title ,self.user)

и модель моего комментария

   from django.db import models

    from posts.models import Post as Post
    from django.contrib.auth.models import User

    class Comment(models.Model):
        post = models.ForeignKey(Post,on_delete=models.CASCADE, null=True, default=1, blank=True)
        name = models.CharField(max_length=20,blank=True, null=True)
        email = models.EmailField(max_length=20,blank=True, null=True)
        body = models.TextField(max_length=200,blank=True, null=True)
        created = models.DateTimeField(auto_now_add=True,blank=True, null=True)
        updated = models.DateTimeField(auto_now=True,blank=True, null=True)
        active = models.BooleanField(default=True,blank=True, null=True)

        class Meta:
            ordering = ('created',)

        def __str__(self):
            return 'Comment by {} on {}'.format(self.name, self.post)

Я могу создать сообщение на администраторе

   from posts.models import Post as Post
    from django.contrib import admin
    from comments.models import Comment
    @admin.register(Comment)
    class CommentAdmin(admin.ModelAdmin):
        list_display = ('name', 'email', 'post', 'created', 'active')
        list_filter = ('active', 'created', 'updated')
        search_fields = ('name', 'email', 'body')

может создать мое сообщение и сохранить его на db

enter image description here enter image description here

теперь у меня есть эта функция, чтобы сохранить комментарий впереди

from django.shortcuts import render
from .models import Post, Comment
from .forms import EmailPostForm, CommentForm

    def post_detail(request, year, month, day, post):
        post = get_object_or_404(Post, slug=post,
                                       status='published',
                                       publish__year=year,
                                       publish__month=month,
                                       publish__day=day)

        # List of active comments for this post
        comments = post.comments.filter(active=True)

        new_comment = None

        if request.method == 'POST':
            # A comment was posted
            comment_form = CommentForm(data=request.POST)
            if comment_form.is_valid():
                # Create Comment object but don't save to database yet
                new_comment = comment_form.save(commit=False)
                # Assign the current post to the comment
                new_comment.post = post
                # Save the comment to the database
                new_comment.save()
        else:
            comment_form = CommentForm()
        return render(request,
                      'blog/post/detail.html',
                      {'post': post,
                       'comments': comments,
                       'new_comment': new_comment,
                       'comment_form': comment_form})

теперь в моем фиде. html у меня есть список сообщений, которые я повторяю с for и с внутренним, для которого я повторяю комментарии

feed. html

       <div class="row"style= "align:center">
            {% for post in posts %}
            <div class="col-sm-12 col-md-8 offset-md-4 mt-5 p-0 post-container,width:50%;">
                    <div class="card" style="width: 32rem;width:50%;">
                        <div class="card-body">
                            <div class="media pt-3 pl-3 pb-1">
                                <a href="{% url "users:detail" post.user.username%}">
                                    <img class="mr-3 rounded-circle" height="35" src="{{ post.profile.picture.url }}" alt="{{ post.user.username }}">
                                </a>
                                <h3 class="card-title">{{ post.title }}</h3>
                            </div>

                                    <p class="card-text">{{ post.desc }}</p>

                        </div>
                    </div>
                <img style="width: 50%; heigth:60%" src="{{ post.photo.url }}" alt="{{ post.title }}">

                <div class="media-body">
                       <b> <p style="margin-top: 5px;">@{{ post.user.username  }} - <small>{{ post.created }}</small>
               &nbsp;&nbsp;
                    <a href="" style="color: #000; font-size: 20px;">
                        <i class="far fa-heart"></i>
                    </a>
                    <br>
                </p></b>



                </div>
            </div>

  {% for comment in comments.post %}
  <div class="comment">
    <p class="info">
      Comment {{ forloop.counter }} by {{ comment.name }}
      {{ comment.created }}
    </p>
    {{ comment.body|linebreaks }}
  </div>
{% empty %}
  <p>There are no comments yet.</p>
{% endfor %}

{% if new_comment %}
  <h2>Your comment has been added.</h2>
{% else %}
  <h2>Add a new comment</h2>
  <form action="." method="post">
    {{ comment_form.as_p }}
    {% csrf_token %}
    <p><input type="submit" value="Add comment"></p>
  </form>
{% endif %}
                {% endfor %}
        </div>
    </div>

но делая это, я получаю это на из сообщения с комментариями

enter image description here

я пропустил некоторый URL (для вызова post_detail) и действие для комментария для? почему я не могу увидеть список комментариев к сообщению?

1 Ответ

2 голосов
/ 15 марта 2020

Здесь в вашей Post модели нет поля для slug. Таким образом, вместо slug передайте сообщение pk в подробный вид следующим образом.

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    # now you can filter the comments here
    comments = post.comment_set.filter(active=True)
    return render(request,'blog/post/detail.html',{'post': post,'comments': comments}

См. документы для получения дополнительной информации

...