0
votes

DoesNotExist at / blog / postComment La requête correspondante de publication n'existe pas

J'essaie d'imprimer les commentaires sous le blog, mais après avoir cliqué sur le bouton Soumettre, l'erreur ci-dessus apparaît. Je veux juste qu'un message de réussite soit affiché en haut de la page Web, pour lequel j'ai écrit la ligne: messages.success(request, 'your comment has been added') , mais l'erreur apparaît!

models.py :

DoesNotExist at /blog/postComment
Post matching query does not exist.
Request Method: POST
Request URL:    http://127.0.0.1:8000/blog/postComment
Django Version: 3.1
Exception Type: DoesNotExist
Exception Value:    
Post matching query does not exist.
Exception Location: C:\Users\jayant nigam\projects\practise\lib\site-packages\django\db\models\query.py, line 429, in get
Python Executable:  C:\Users\jayant nigam\projects\practise\Scripts\python.exe
Python Version: 3.8.5
Python Path:    
['C:\\Users\\jayant nigam\\projects\\everythingcs',
 'C:\\Python38\\python38.zip',
 'C:\\Python38\\DLLs',
 'C:\\Python38\\lib',
 'C:\\Python38',
 'C:\\Users\\jayant nigam\\projects\\practise',
 'C:\\Users\\jayant nigam\\projects\\practise\\lib\\site-packages']
Server time:    Fri, 02 Oct 2020 19:21:31 +0000

urls.py :

{% extends 'base.html' %}
{% block title %}
{{ post.title}}
{% endblock title %}

{% block body %}

<div class="container">
    <div class="jumbotron my-4">
    <div class="blog-post">
        <h2 class="blog-post-title">{{post.title}}</h2>
        <p class="blog-post-meta">{{post.timeStamp}} by <a href="#">{{post.author}}</a></p>

        <p>{{post.content}}</p>
      </div>
    </div>
</div>

<div>
  <div class="container">
    <h2>Comments</h2>
      <form action="/blog/postComment" method = 'post'>
        {% csrf_token %}
        <input type="text" name = 'comment' placeholder = 'type here'>
        <input type="hidden" name = "comment" value = "{{post.sno}}">
        <input type="submit" value = 'submit'>
      </form>
    <div class="row my-2">
      <div class="col-md-2">image here</div>
      <div class="col-md-10">comments here</div>
    </div>
  </div>
</div>

{% endblock body %}

view.py :

from django.shortcuts import render, HttpResponse, redirect
from blog.models import Post, BlogComment


def blogHome(request):
    allpost = Post.objects.all()
    context = {'allposts': allpost}
    return render(request, 'blog/blogHome.html', context)


def blogPost(request, slug):
    post = Post.objects.filter(slug=slug).first()
    comments = BlogComment.objects.filter(post=post)
    context = {'post': post, 'comments': comments}
    return render(request, 'blog/blogPost.html', context)
    


def postComment(request):
    if request.method == 'POST':
        comment = request.POST.get('comment')
        user = request.user
        postSno = request.POST.get("postSno")
        post = Post.objects.get(sno=postSno)

        comment = BlogComment(comment=comments, user=user, post=post)
        comment.save()
        messages.success(request, 'your comment has been added')

        return redirect(f"/blog/{post.slug}")

    return redirect('home')

blogPost.html :

from django.urls import path, include
from blog import views

urlpatterns = [
    path('postComment', views.postComment, name='postComment'),
    path('', views.blogHome, name='home'),
    path('<str:slug>', views.blogPost, name='blogpost'),
]

journal des erreurs :

from django.db import models
from django.contrib.auth.models import User
from django.utils.timezone import now
# Create your models here.


class Post(models.Model):
    sno = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50)
    content = models.TextField()
    author = models.CharField(max_length=50)
    slug = models.SlugField(max_length=200)
    timeStamp = models.DateTimeField(blank=True)

    def __str__(self):
        return self.title + " by " + self.author


class BlogComment(models.Model):
    sno = models.AutoField(primary_key=True)
    comment = models.TextField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True)
    timestamp = models.DateTimeField(default=now)

Je ne sais pas pourquoi cette erreur apparaît!


0 commentaires

3 Réponses :


0
votes

Votre erreur est dans le modèle. Vous avez attribué un name erroné à l'une de vos entrées:

Dans votre code:

<input type="hidden" name = "postSno" value = "{{post.sno}}">

Bonne version:

<input type="hidden" name = "comment" value = "{{post.sno}}">


1 commentaires

ne fonctionne pas pour moi! une nouvelle erreur apparaît NameError at /blog/postComment name 'comments' is not defined



0
votes

Pour résoudre votre premier problème, vous devez changer la ligne post = Post.objects.get(sno=postSno) (dans la fonction postComment ) en quelque chose comme:

from django.http import Http404

try:
    post = Post.objects.get(sno=postSno)
except Post.DoesNotExist:
    return Http404("Post does not exist") # or return HttpResponse("Post does not exist")

car il peut y avoir des situations dans lesquelles cette requête ne peut renvoyer aucun résultat et par conséquent, elle DoesNotExistError . Le deuxième problème (je veux dire NameError at /blog/postComment name 'comments' is not defined ) vient de la même fonction ... changer cette ligne comment = BlogComment(comment=comments, user=user, post=post) en comment = BlogComment(comment=comment or '', user=user, post=post) résoudra ce problème.


0 commentaires

0
votes

Modifier les commentaires en commentaire en tant que "commentaires" n'est pas défini. Vous utilisez un commentaire.


0 commentaires