#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
или aModelForm
заканчивается…Form
суффиксом, чтобы избежать коллизий с названием модели и дать понять, что мы работаем с формой. Поэтому, возможно, было бы лучше использоватьCommentForm
вместо.comment