Недавно я решил добавить блок комментариев к моему шаблону в моем приложении django, но когда я добавляю его в свое приложение, я столкнулся с этой ошибкой:
add_comment_to_post() got an unexpected keyword argument 'item_id'
мой template.html:
{% block content %}
<form action = "#" method = "post" novalidate = "novalidate">
{% csrf_token %}
{{ form.as_p }}
<div class = "row">
<div class = "col-md-4">
<p><label>Name*</label><input type = "text" name = "your-name" value = ""
size = "60" class = ""
aria-required = "true"
aria-invalid = "false"></p>
</div>
<div class = "col-md-4">
<p><label>Email*</label><input type = "text" name = "your-email"
value = ""
size = "60" class = ""
aria-required = "true"
aria-invalid = "false"></p>
</div>
<div class = "col-md-4">
<p><label>Website</label><input type = "text" name = "your-website"
value = ""
size = "60" class = ""
aria-required = "true"
aria-invalid = "false"></p>
</div>
<div class = "col-md-12">
<p><label>Message</label><textarea name = "your-message" cols = "60"
rows = "3" class = ""
aria-invalid = "false"></textarea>
</p>
</div>
</div>
<div class = "dividewhite2"></div>
<p>
<button type = "button" href = "{% url 'add_comment_to_post' pk=item.pk %}"
class = "btn btn-lg btn-darker">Post Comment
</button>
</p>
</form>
{% endblock %}
мой models.py:
from django.db import models
from datetime import date
from django.utils import timezone
# Create your models here.
class Blogs(models.Model):
main_image = models.ImageField(upload_to='Blogs/', help_text='This Image Is Gonna To Be Show At Blogs Page.',
blank=False, default='')
class Comment(models.Model):
post = models.ForeignKey('Blog.Blogs', on_delete=models.CASCADE, related_name='comments')
author = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
approved_comment = models.BooleanField(default=False)
def approve(self):
self.approved_comment = True
self.save()
def __str__(self):
return self.text
мой form.py:
from django.forms import ModelForm
from .models import Blogs, Comment
class CommentForm(ModelForm):
class Meta:
model = Comment
fields = ('author', 'text',)
my views.py :
from django.shortcuts import render, get_object_or_404, redirect
from Blog.forms import CommentForm
from .models import Blogs, Comment
def item(request, items_id):
items = get_object_or_404(Blogs, pk=items_id)
return render(request, 'Blog/Items.html', {'item': items, 'comments': Comment})
def add_comment_to_post(request, pk):
post = get_object_or_404(Blogs, pk=pk)
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.save()
return redirect('post_detail', pk=post.pk)
else:
form = CommentForm()
return render(request, 'blog/Items.html', {'form': form})
и мой urls.py:
from django.urls import path
from Blog import views
from Blog import models
urlpatterns = [
path('<int:item_id>/', views.add_comment_to_post, name='add_comment_to_post'),
path('<int:items_id>/', views.item, name='Itemz'),
]
Я проверял свой код много раз, но не могу понять, в чем моя проблема. Кто-нибудь знает, как я могу добавить комментарий к своему приложению или в чем моя проблема? Кроме того, прошу прощения за ошибки в вопросе.
item - это объект в моем шаблоне, а item.pk передается для просмотра в "href = "{% url 'add_comment_to_post' pk=item.pk %}"
Ах хорошо, я неправильно понял взгляды.





Возможно, дважды проверьте свои шаблоны URL? Пытаться:
urlpatterns = [
path('<int:pk>/', views.add_comment_to_post, name='add_comment_to_post'),
Имя переменной в вашем методе просмотра должно совпадать с именем переменной в URL-адресе. Следовательно, вам нужно, чтобы оба были pk или оба были item_id.
если я изменю свой путь к path('<int:pk>/', views.add_comment_to_post, name='add_comment_to_post'),, я столкнусь с этой ошибкой: Reverse for 'add_comment_to_post' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['blog\/(?P<pk>[0-9]+)\/$'] и pk и items_id одинаковы, но pk не определен в urls.py, поэтому мне придется использовать item:id вместо этого.
изменить это
def add_comment_to_post(request, pk):
К:
def add_comment_to_post(request, item_id):
Затем измените всюду внутри функции, которую вы написали pk на item_id
views.py
def add_comment_to_post(request, item_id):
post = get_object_or_404(Blogs, pk=item_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('post_detail', pk=post.pk)
else:
form = CommentForm()
return render(request, 'blog/Items.html', {'form': form, 'item': post})
и в вашем шаблоне:
<button type = "button" href = "{% url 'add_comment_to_post' item.pk %}"
class = "btn btn-lg btn-darker">Post Comment
</button>
Я изменил его и получаю эту ошибку: Reverse for 'add_comment_to_post' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['blog\/(?P<item_id>[0-9]+)\/$']
Я уже делаю это, и я изменил pk на item_id в своем классе, но это не работает.
Я думаю, что проблема в моем файле .html, потому что моя IDE говорит это как предупреждение в строке, которую я пишу <button type = "button" href = "{% url 'add_comment_to_post' pk=item.pk %}", и мое предупреждение IDE: The following arguments are missing: 'item_id'. Django inspection that checks " {% url %} " tag for required arguments. It ensures that all arguments are passed correctly
href = "{% url 'add_comment_to_post' pk = item.pk%}" вместо pk = item.pk поместите item_id = item.pk или просто сделайте это href = "{% url 'add_comment_to_post' item.pk%}"
Прокомментируйте свою кнопку или удалите href и перезагрузите страницу. Скажи мне, что у тебя есть
правильный формат заключается в том, что я помещаю {% url 'add_comment_to_post' pk=item.pk %} в тег кнопки или помещаю это как действие в теге формы?
Измените pk = item.pk на item_id = item.pk и внесите изменения в мой ответ. Использовать везде в вашем представлении item_id
к сожалению, я получаю ту же ошибку. Насколько я понимаю, эта ошибка возникает в path('<int:items_id>/', views.add_comment_to_post, name='add_comment_to_post'),, когда я меняю item_id в urls.py, моя ошибка тоже изменяется.
путь должен быть path('<int:item_id>/', views.add_comment_to_post, name='add_comment_to_post'), а не items_id, а item_id. Я обновил свой ответ
моя проблема решена, это происходит потому, что я передаю один параметр двум разным представлениям.
Тогда это нормально
Если вы не возражаете, я отвечу на этот вопрос и вставлю сюда правильный код.
Проблема возникает из-за того, что в urls.py было две темы, которые были переданы одному просмотру. измените взгляды на это:
urlpatterns = [
path('<int:pk>/', views.item, name='Itemz'),
]
затем измените часть html на это:
{% if not user.is_authenticated %}
<p><a href = "{% url 'login' %}" class = "btn btn-gr btn-xs">Login To Send
A Command.</a></p>
{% endif %}
<div class = "dividewhite2"></div>
{% if user.is_authenticated %}
<form method = "post" novalidate = "novalidate">
{% csrf_token %}
{{ form.as_p }}
<div class = "dividewhite2"></div>
<p>
<button href = "{% url 'Itemz' item.id %}" type = "submit"
class = "btn btn-lg btn-darker">Post Comment
</button>
</p>
</form>
{% endif %}
теперь проект Django будет работать правильно.
Откуда взялось item.pk? Он есть в шаблоне yout, но не передается из представления.
href = "{% url 'add_comment_to_post' pk=item.pk %}"