Невозможно преобразовать ключевое слово 'slug' в поле
Я делаю систему комментариев и ответов в моем блоге, используя Django. Сейчас я пытаюсь получить набор комментариев, которые не имеют ответных комментариев (если я не сделаю этого, ответные комментарии будут отображаться на странице как обычные комментарии). Вот ошибка, которую я получил:
FieldError at /post/fourh-news
Невозможно преобразовать ключевое слово 'slug' в поле. Возможные варианты: comm_to_repl, comm_to_repl_id, comment_content, created, id, post, post_of_comment, post_of_comment_id, replies, user_created_comment, user_created_comment_id
Метод запроса: GET
URL запроса: http://127.0.0.1:8000/post/fourh-news.
Версия Django: 4.1.2
Тип исключения: FieldError
Значение исключения:
Невозможно преобразовать ключевое слово 'slug' в поле. Варианты: comm_to_repl, comm_to_repl_id, comment_content, created, id, post, post_of_comment, post_of_comment_id, replies, user_created_comment, user_created_comment_id
Расположение исключения: D:\pythonProject28django_pet_project\venv\lib\site-packages\django\db\models\sql\query.py, line 1709, in names_to_path
Возникает во время: blog.views.ShowSingleNews
Версия Python: 3.10.4
Модель:
class Post(models.Model):
title = models.CharField(max_length=150, verbose_name='Название')
slug = models.CharField(max_length=100, unique=True, verbose_name='Url slug')
content = models.TextField(verbose_name='Контент')
created_at = models.DateTimeField(auto_now=True, verbose_name='Дата добавления')
updated_at = models.DateTimeField(auto_now=True, verbose_name='Дата обновления')
posted_by = models.CharField(max_length=100, verbose_name='Кем добавлено')
photo = models.ImageField(upload_to='photos/%Y/%m/%d', verbose_name='Фото', blank=True)
views = models.IntegerField(default=0)
category = models.ForeignKey('Category', on_delete=models.PROTECT, verbose_name='Категория')
tag = models.ManyToManyField('Tags', verbose_name='Тэг', blank=True)
comment = models.ForeignKey('Comment', verbose_name='Комментарий', on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('single_news', kwargs={'slug': self.slug})
class Meta:
ordering = ['-created_at']
class Category(models.Model):
title = models.CharField(max_length=150, verbose_name='Название')
slug = models.CharField(max_length=100, unique=True, verbose_name='category_url_slug')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('category', kwargs={'slug': self.slug})
class Meta:
ordering = ['title']
class Tags(models.Model):
title = models.CharField(max_length=150, verbose_name='Название')
slug = models.CharField(max_length=100, unique=True, verbose_name='tag_url_slug')
def get_absolute_url(self):
return reverse('news_by_tag', kwargs={'slug': self.slug})
def __str__(self):
return self.title
class Meta:
ordering = ['title']
class Comment(models.Model):
user_created_comment = models.ForeignKey(User, related_name='user', on_delete=models.CASCADE, null=True)
post_of_comment = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE, null=True)
comment_content = models.TextField(verbose_name='Текст комментария')
created = models.DateTimeField(auto_now=True)
comm_to_repl = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, related_name='replies')
def get_absolute_url(self):
return reverse('single_news', kwargs={'slug': self.post_of_comment.slug})
class Meta:
ordering = ['-created']
Вид:
class ShowSingleNews(DetailView):
model = Post
template_name = 'blog/single_news.html'
context_object_name = 'post'
raise_exception = True
form = CommentForm
def post(self, request, *args, **kwargs):
form = CommentForm(request.POST)
if form.is_valid():
post = self.get_object()
form.instance.user_created_comment = request.user
form.instance.post_of_comment = post
commrepl = request.POST.get("commentID")
form.instance.comm_to_repl_id = int(commrepl)
form.save()
else:
print("some error with form happened")
print(form.errors.as_data())
return redirect(reverse("single_news", kwargs={
"slug": self.get_object().slug
}))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = Post.objects.get(slug=self.kwargs['slug'])
context['form'] = self.form
self.object.views = F('views') + 1
self.object.save()
self.object.refresh_from_db()
return context
def get_queryset(self):
return Comment.objects.filter(replies=None)
Шаблон:
Urls:
urlpatterns = [
path('', HomePage.as_view(), name='home'),
path('category/<str:slug>/', GetCategory.as_view(), name='category'),
path('post/<str:slug>', ShowSingleNews.as_view(), name='single_news'),
path('tag/<str:slug>', GetNewsByTag.as_view(), name='news_by_tag'),
path('search/', Search.as_view(), name='search'),
path('registration/', registration, name='registration'),
path('login/', loginn, name='login'),
path('logout/', logoutt, name='logout'),
Формы:
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['comment_content']
Нужно немного изменить передачу URL
в HTML следующим образом...
<form method="POST" action="{% url 'single_news' post.slug %}">
{% csrf_token %}
<input type="hidden" id="commentID">
<div class="comment">
<input type="text" name="comment_content" placeholder="Comment" class="comment">
</div>
<div class="post">
<input type="submit" value="Post">
</div>
</form>
NOTE:- Если вы хотите передать url с ключом, вы можете сделать это следующим образом
<form method="POST" action="{% url 'single_news'?slug=post.slug %}">
{% csrf_token %}
<input type="hidden" id="commentID">
<div class="comment">
<input type="text" name="comment_content" placeholder="Comment" class="comment">
</div>
<div class="post">
<input type="submit" value="Post">
</div>
</form>