【问题标题】:Reverse for 'post-detail' with keyword arguments '{'kwargs': {'slug': 'long-establis使用关键字参数'{'kwargs':{'slug':'long-establis'反转'post-detail'
【发布时间】:2019-08-07 19:09:46
【问题描述】:

我正在尝试将评论字段添加到我的帖子详细信息视图中。但是一旦我在调用 save() 后添加重定向 url。这给了我这样的错误。

找不到带有关键字参数“{'kwargs': {'slug': 'long-established-fact-that-a-reader-will'}}”的“post-detail”。尝试了 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

【问题讨论】:

    标签: python django


    【解决方案1】:

    在您的第四条路径中,您使用了 &lt;str:slug&gt; - 我不相信 URL 捕获类型 str 会捕获 slug 中使用的破折号。

    试试这个路径:path('post/&lt;slug:slug&gt;/', postDetail, name='post-detail'),

    编辑

    您的postDetail() 重定向中还缺少reverse

    @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

    【讨论】:

    • @adityakumar 您是否尝试在您的 urlpatterns 上方添加 app_name,然后在重定向中引用它?即app_name = 'main'redirect('main:post-detail, ...)
    • @adityakumar 像我写的那样试一试,重启你的服务器,如果有任何改变,请告诉我
    • 添加 app_name 后,我什至无法访问它显示的主页 url。未找到“博客”的反向。 'blog' 不是有效的视图函数或模式名称。
    • @adityakumar 您需要更新您的所有 reverse 网址以包含新的命名空间。即reverse('main:&lt;url-name&gt;)'
    • def get_absolute_url(self): return reverse('post-detail', kwargs={'slug': self.slug})
    猜你喜欢
    • 2016-05-24
    • 2016-11-12
    • 2019-10-03
    • 1970-01-01
    • 2018-08-07
    • 2021-07-11
    • 2016-11-12
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多