Django NoReverseMatch:找不到参数“(1,)”的'blog_detail'反转

Django NoReverseMatch :Reverse for 'blog_detail' with arguments '(1,)' not found

我创建了一个主题作为博客项目的类别。 我将 'topic' 作为 PK 指向我的模型 通过以下路径访问成功: http://127.0.0.1:8000/django/1 http://127.0.0.1:8000/IDE/2 django 和 IDE 是我模型的主题

from django.shortcuts import render, get_object_or_404
from .models import Blog, Topic
from django.views.generic import DetailView

def post_list(request, topic_slug=None):
    topic= None
    topics = Topic.objects.all()
    blogs = Blog.objects.filter(available=True)
    if topic_slug:
        topic = get_object_or_404(Topic, slug=topic_slug)
        blogs = blogs.filter(topic=topic)
    return render(request,
                  'topiclist.html',
                  {'topics': topics,
                  'topic':topic,
                   'blogs': blogs,
                   })

class BlogDetail(DetailView):
    model = Blog
    template_name ='detail.html'
from django.urls import path
from . import views
from .views import BlogDetail

urlpatterns = [
   path('<slug:topic_slug>/', views.post_list, name='post_list'),
   path('<slug:topic_slug>/<int:pk>/', BlogDetail.as_view(), name='blog_detail'),
]
from django.db import models
from ckeditor.fields import RichTextField
from django.urls import reverse

class Topic(models.Model):
   name = models.CharField(max_length=50)
   slug = models.SlugField(max_length=50, default='self.name', db_index=True, unique=True)

   class Meta:
       verbose_name = 'topic'
       verbose_name_plural = 'topics'

   def __str__(self):
       return self.name

   def get_absolute_url(self):
       return reverse('post:topiclist', args=[self.slug])

class Blog(models.Model):
   title =  models.CharField(max_length=50)
   author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
   content = RichTextField()
   topic = models.ForeignKey(Topic, default=1, on_delete=models.SET_DEFAULT)
   available = models.BooleanField(default=True)

   class Meta:
       verbose_name = 'post'
       verbose_name_plural  = 'posts'

   def __str__(self):
       return self.title

   def get_absolute_url(self):
       return reverse('post_detail', args=[str(self.id)])

显示错误

NoReverseMatch at /django/
Reverse for 'blog_detail' with arguments '(1,)' not found. 1 pattern(s) tried: ['(?P<topic_slug>[-a-zA-Z0-9_]+)/(?P<pk>[0-9]+)/$']

当我使用 URL 配置时 blog_detail

My HTML template
{% block content %}
 {% for blog in blogs %}
<a href="{% url 'blog_detail' blog.pk %}">{{ topic.title }}</a></li>
 {% endfor %}
{% endblock content %}

它适用于使用 post_list 但是当我使用 blog_detail 时它显示错误。对此有什么想法吗?我是 django 和编程的新手。如果有人能提供帮助,非常感谢。我读了这个问题,但没有帮助 Reverse for 'blog_detail' with no arguments not found. 1 pattern(s) tried: ['blog/(?P<pk>[0-9]+)$']

根据您的 urls.py 代码,blog_detail url 需要两个参数(主题 slug 和 pk),而您只提供了 pk。如果你同时传递两者,它应该可以工作(或者重构 url 所以不需要主题 slug)。

{% url 'blog_detail' blog.topic.slug blog.pk %}