#python #django
#python #django
Вопрос:
Я пытаюсь добавить поля комментариев к моему представлению после детализации. Но как только я добавлю URL перенаправления после вызова save(). Это выдает мне ошибку примерно такого рода.
Обратное для ‘post-detail’ с аргументами ключевого слова ‘{‘kwargs’: {‘slug’: ‘давно установленный факт, который понравится читателю’}}’ не найдено. попробовано 1 шаблон (ы): [‘post/(?P[^/] )/$’]
это мой код
posts/views.py
@login_required
def postDetail(request, slug):
post = get_object_or_404(Post, slug=slug)
latest_post = Post.objects.order_by('-timestamp')[0:4]
form = CommentForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
form.instance.user = request.user
form.instance.post = post
form.save()
return redirect('post-detail', kwargs = {
'slug': post.slug
})
context ={
'form': form,
'post': post,
'latest_post': latest_post
}
return render(request, 'posts/post_detail.html', context)
posts/urls.py
from django.urls import path, include
from django.conf.urls.static import static
from posts.views import index,postDetail, categoryDetail, blog, search
urlpatterns = [
path('', index, name="home"),
path('blog/', blog, name="blog"),
path('search/', search, name='search'),
path('post/<str:slug>/', postDetail, name='post-detail'),
path('category/<slug>/', categoryDetail, name='category-detail'),
]
posts/models.py
from tinymce import HTMLField
from django.db import models
from django.contrib.auth import get_user_model
from slugger import AutoSlugField
from django.urls import reverse
# Create your models here.
User = get_user_model()
def upload_location(instance, filename):
return "%s/%s" %(instance.slug, filename)
class Author(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
def __str__(self):
return self.user.username
class Category(models.Model):
title = models.CharField(max_length=20)
slug = AutoSlugField(populate_from='title')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('category-detail', kwargs={'slug': self.slug})
class Post(models.Model):
title = models.CharField(max_length = 100)
slug = AutoSlugField(populate_from='title')
overview = models.CharField(max_length= 200)
timestamp = models.DateTimeField(auto_now_add=True)
content = HTMLField()
comment_count = models.IntegerField(default=0)
view_count = models.IntegerField(default=0)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
thumbnail = models.ImageField(
upload_to=upload_location,
null=True,
blank=True)
category = models.ManyToManyField(Category)
featured = models.BooleanField()
previous_post = models.ForeignKey('self', related_name= 'previous', on_delete=models.SET_NULL, blank=True, null=True)
next_post = models.ForeignKey('self', related_name= 'next', on_delete=models.SET_NULL, blank=True, null=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'slug': self.slug})
@property
def get_comments(self):
return self.comments.all().order_by('-timestamp')
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_now_add=True)
content = models.TextField()
post = models.ForeignKey(Post, related_name='comments',on_delete=models.CASCADE)
def __str__(self):
return self.user.username
Ответ №1:
В вашем 4-м пути вы использовали <str:slug>
— я не верю, что тип отслеживания URL str
улавливает тире, используемые в slugs.
Попробуйте вместо этого этот путь: path('post/<slug:slug>/', postDetail, name='post-detail'),
Редактировать
Вам также не хватает reverse
в вашем postDetail()
редиректе:
@login_required
def postDetail(request, slug):
post = get_object_or_404(Post, slug=slug)
latest_post = Post.objects.order_by('-timestamp')[0:4]
form = CommentForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
form.instance.user = request.user
form.instance.post = post
form.save()
return redirect(reverse('main:post-detail', kwargs = {
'slug': post.slug
}))
context ={
'form': form,
'post': post,
'latest_post': latest_post
}
return render(request, 'posts/post_detail.html', context)
https://docs.djangoproject.com/en/2.1/topics/http/urls/#path-converters
Комментарии:
1. @adityakumar вы пробовали добавлять
app_name
над вашими URL-шаблонами, а затем ссылаться на него в перенаправлении? т.е.app_name = 'main'
,redirect('main:post-detail, ...)
2. @adityakumar попробуйте, как я написал, перезапустите свой сервер и дайте мне знать, если это что-нибудь изменит
3. после добавления app_name я даже не могу перейти к домашнему URL, в нем написано это. Обратный для ‘blog’ не найден. ‘blog’ не является допустимым именем функции просмотра или шаблона.
4. @adityakumar Вам нужно будет обновить все ваши
reverse
URL-адреса, чтобы включить новое пространство имен. т.е.reverse('main:<url-name>)'
5. def get_absolute_url(self): возвращает обратный(‘post-detail’, kwargs={‘slug’: self.slug})