首页 > 解决方案 > Django NoReverseMatch:找不到带有参数'(1,)'的'blog_detail'的反向

问题描述

我创建了一个主题作为博客项目的类别。我将“主题”作为我的模型的 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 和编程的新手。非常感谢,如果有人可以提供帮助。我读了这个问题,但 没有找到没有参数的“blog_detail”的 Reverse 无济于事。尝试了 1 种模式:['blog/(?P<pk>[0-9]+)$']

标签: djangopython-3.xdjango-3.0

解决方案


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

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


推荐阅读