Ошибка Django : не найдено совпадения в /Post/8 для «комментариев» с аргументами» («,)»

#python #html #django

Вопрос:

Я работаю над своим проектом, я столкнулся с проблемой с «КОММЕНТАРИЕМ»: я добавляю комментарий в виде раздела, когда пользователь нажимает кнопку «Просмотреть», чтобы просмотреть сообщение с домашней страницы.

Ошибка Django : не найдено совпадения в /Post/8 для «комментариев» с аргументами» («,)». 1 шаблон(ы) попробовал: [‘Сообщение/(?P[0-9] )$’]

views.py файл

 def viewList(request, id): item = Post.objects.get(id=id) context = {  'item': item,  'comment_form': comment(),  'comments': item.get_comments.all(), } return render(request, 'auctions/item.html', context)  @login_required def comments(request, id):  listing = Post.objects.get(id=id)  form = comment(request.PSOT)  newComment = form.save(commit=False)  newComment.user = request.user  newComment.listing = listing  newComment.save() return HttpResponseRedirect(reverse("listing", {'id': id}))  

models.py файл

 class Post(models.Model):  # data fields title = models.CharField(max_length=64) textarea = models.TextField()  # bid price = models.FloatField(default=0) currentBid = models.FloatField(blank=True, null=True)  imageurl = models.CharField(max_length=255, null=True, blank=True) category = models.ForeignKey(  Category, on_delete=models.CASCADE, default="No Category Yet!", null=True, blank=True)  creator = models.ForeignKey(User, on_delete=models.PROTECT) watchers = models.ManyToManyField(  User, blank=True, related_name='watched_list') date = models.DateTimeField(auto_now_add=True)  # for activated the Category activate = models.BooleanField(default=True)  def __str__(self):  return f"{self.title} | {self.textarea} | {self.date.strftime('%B %d %Y')}"  class Comment(models.Model):  body = models.CharField(max_length=100) createdDate = models.DateTimeField(default=timezone.now)  # link to the post model auction = models.ForeignKey(  Post, on_delete=models.CASCADE, related_name="get_comments")  user = models.ForeignKey(User, on_delete=models.CASCADE)  status = models.BooleanField(default=True)  def __str__(self):  return self.createdDate.strftime('%B %d %Y')  

HTML-файл

 lt;!-- Comments --gt;  lt;div class="comments"gt;  lt;pgt;Add a comment:lt;/pgt;  lt;div class="row"gt;  lt;div class="col-6"gt;  lt;form action="{% url 'comments' listing.id %}" method="post"gt;  {% csrf_token %}  lt;div class="input-group"gt;  {{ comment_form }}  lt;/divgt;  lt;input type="submit" value="save" class="btn btn-outline-dark btn-sm m-1"/gt;  lt;/formgt;  lt;/divgt;  {% for comment in comments %}  lt;div class="col-4"gt;  Comments:  lt;h4gt;Name: {{comment.user}}lt;/h4gt;  lt;h4gt;Content: {{comment.body}}lt;/h4gt;  lt;h4gt;Date: {{comment.createdDate}}lt;/h4gt;  lt;/divgt;  {% endfor %}  lt;/divgt;  lt;/divgt;  

url.py

 from django.urls import path  from . import views   urlpatterns = [  path("", views.index, name="index"),  path("login", views.login_view, name="login"),  path("logout", views.logout_view, name="logout"),  path("register", views.register, name="register"),  path("category/", views.category, name="category"),  path("Post", views.createList, name="createList"),  #comment url  path("Post/lt;str:idgt;", views.viewList, name="viewList"),  path("Post/lt;int:idgt;", views.comments, name="comments"), ]  

Ответ №1:

Вы передали Post объект как item шаблон, следовательно, вам следует разрешить URL-адрес с помощью:

 lt;!-- use item not listing ↓ --gt; lt;form action="{% url 'comments' item.id %}" method="post"gt;  … lt;/formgt; 

В вашем представлении для создания комментариев также есть некоторые ошибки: вы должны использовать request.POST , а не request.PSOT :

 from django.shortcuts import redirect  @login_required def comments(request, id):  if request.method == 'POST'  form = comment(request.POST, request.FILES)  if form.is_valid():  form.instance.user = request.user  form.instance.auction_id = id  form.save()  return redirect('viewList', id=id) 

Кроме того, ваша comment форма должна наследовать ModelForm , а не Form :

 class comment(forms.ModelForm):   class Meta:  model = Comment  fields = ('content',)  widgets = {  'content': forms.Textarea(attrs={"class": "form-control"})  } 

наконец, у вас urls.py есть два (полностью) перекрывающихся шаблона, вы должны использовать другой URL-адрес для добавления данного комментария:

 urlpatterns = [  # …  #comment url  path('Post/lt;int:idgt;', views.viewList, name='viewList'),  path('Post/lt;int:idgt;/add', views.comments, name='comments'), ] 

Примечание: Обычно a Form или a ModelForm заканчивается …Form суффиксом, чтобы избежать коллизий с названием модели и дать понять, что мы работаем с формой. Поэтому, возможно, было бы лучше использовать CommentForm вместо comment .