Django NoReverseMatch:反向为'blog_detail',参数为'(1,)'

问题描述 投票:0回答:1

我创建了一个主题作为博客项目的类别。我指出“主题”是我模型的PK通过以下路径可以成功访问它:http://127.0.0.1:8000/django/1http://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]+)/$']

当我使用以下网址的网址配置时 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]+)$']

django python-3.x django-3.0
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.