Почему DB не сохраняет комментарий (Django)

#python #django

#python #django

Вопрос:

Введенные комментарии в форме не сохраняются в базе данных и нигде не отображаются. После нажатия кнопки сохранения он просто перенаправляется на другую страницу, и комментарии не отображаются. Я пытаюсь создать форму для ввода комментариев непосредственно со страницы сайта, я уже настроил ее с панели администрирования. Спасибо!

views.py

 class BarbersPage(ListView):
    model = Post
    template_name = 'main/barbers.html' 
    context_object_name = 'posts'

def post_new(request):
    post = get_object_or_404(Post)
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            form.save() 
            return redirect('barbers')
    else:
            form = CommentForm()
    return render(request, 'main/post_detail.html', {'form': form})
  

barbers.html

 {% for post in posts %}
          <img src="{{MEDIA_URL}}{{post.photo.url}}" width="800"  />

          <h3>
        {{ post.name_barber}} 
          </h3>
     <p>{{ post.description}}</p>
     <h3> Comments.. </h3>
   
    {% if not post.comments.all %}
    no comments yet...<a href = "#">Add one</a>

    {% else %}

        {% for comment in post.comments.all %}

    <strong>
        {{ comment.name }}
        {{ comment.add_date }}
    </strong>
        <p>{{comment.body }}</p>
  
        {% endfor %}   
    {% endif %}           
{% endfor %}
  

post_detail.html

 <h1>New comment</h1>
    <form method="POST" class="post-form">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Save</button>
    </form>
  

urls.py

 urlpatterns = [
    path('',views.HomePage.as_view(),name='index'),
    path('barbers/',views.BarbersPage.as_view(), name='barbers'),
    path('post_detail/', views.post_new, name='post_detail'),
  
]
  

models.py

 class Post(models.Model):
    photo       = models.ImageField(upload_to='media/photos/',null=True, blank=True)
    name_barber = models.CharField(max_length=30, null=True, blank=True)
    description = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.description[:10]


class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=30)
    body = models.TextField(null=True)
    add_date = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return '%s - %s' % (self.post, self.name)
  

forms.py

 class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'body')
  

Ответ №1:

Строка

 post = get_object_or_404(Post)
  

в вашем представлении функция post_new() не кажется правильной.
Функция get_object_or_404() должна получить некоторые параметры запроса для идентификации одного Post экземпляра; обычно вы передаете PK или slug в качестве параметров функции.

Вы уверены, что при отправке вашей формы не возникает ошибок?


Кроме того, нигде, по вашему мнению, вы не привязываете свой новый комментарий к Post объекту, поэтому, конечно post.comments.all , он будет пустым в вашем шаблоне.

Ваш вид, вероятно, должен выглядеть примерно так:

 def post_new(request, post_id):
    post = get_object_or_404(Post, pk=post_id)

    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False) 
            comment.post = post
            comment.save()

            return redirect('barbers')
    ...
  

соответствующим образом измените свои URL-адреса:

 urlpatterns = [
    ...
    path('post_detail/<int:post_id>/', views.post_new, name='post_detail'),
    ...
]
  

и не забудьте передать post_id URL-адрес при отправке новой формы комментария.

Комментарии:

1. после изменения views.py я получаю сообщение об ошибке: ошибка типа в /post_detail/ post_new() отсутствует 1 требуемый позиционный аргумент: метод запроса ‘post_id’: GET

2. @Dire_straits ну да, вам нужно передать post_id URL и представление; код не может угадать, к какому сообщению вы хотите добавить комментарий.

3. Спасибо, но как теперь я не могу открыть страницу post_detail. Как я могу написать код, чтобы форма ввода была включена barbers.html ?