Обратный для ‘post-detail’ с аргументами ключевого слова ‘{‘kwargs’: {‘slug’: ‘long-establis

#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})