Django - 如何创建一个有效的slu ur网址?

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

我是新手,在尝试显示帖子的详细信息页面时,我一直在与错误作斗争。我已经检查了与此问题相关的其他答案,但解决方案仍然不适合我。

这是我得到的错误:

Reverse for 'blog_post' with no arguments not found. 1 pattern(s) tried: ['blog\\/post/(?P<slug>[-\\w]+)/$']

Django error page

这是我的模特:

class Post(models.Model):
    STATUS_CHOICES = (
    ('draft', 'Draft'),
    ('published', 'Published'),
)

    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique_for_date='publish')
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, 
       default='draft')

   class Meta:
     ordering = ('-publish',)

   def __str__(self):
     return self.title

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

查看功能:

class BlogHomePageView(ListView):
  model = Post
  template_name = 'blog/index.html'

class PostDetailView(DetailView):
  model = Post
  template_name = 'blog/post.html'
  slug_url_kwarg = 'slug'
  query_pk_and_slug = True

URL模式:

path('', BlogHomePageView.as_view(), name='blog_home'),
re_path(r'post/(?P<slug>[-\w]+)/$', PostDetailView.as_view(), name='blog_post'),

base.html文件

<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav">
    <div class="container">
        <a class="navbar-brand" href="index.html">Toluwalemi</a>
        <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse"
                data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false"
                aria-label="Toggle navigation">
            Menu
            <i class="fas fa-bars"></i>
        </button>
        <div class="collapse navbar-collapse" id="navbarResponsive">
            <ul class="navbar-nav ml-auto">
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_home' %}">Home</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_about' %}">About</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_post' %}">Sample Post</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'blog_contact' %}">Contact</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

详细页面:

{% extends 'blog/base.html' %}

{% block title %}Post{% endblock %}


<!-- Page Header -->
{% block page_header %}
    <div class="post-heading">
        <h1>{{ post.title }}</h1>
        <h2 class="subheading">Problems look mighty small from 150 miles up</h2>
        <span class="meta">Posted by
              <a href="#">{{ post.author }}</a>
              on {{ post.publish }}</span>
    </div>
{% endblock %}

<!-- Post Content -->
<article>
    {% block content %}
        <p>{{ post.body }}</p>

列表页面:

{% extends 'blog/base.html' %}

{% block title %}Home{% endblock %}

<!-- Page Header -->
{% block page_header %}
    <div class="site-heading">
        <h1>Toluwalemi's Blog</h1>
        <span class="subheading">Official Blog</span>
    </div>
{% endblock %}

<!-- Main Content -->
{% block content %}
    {% for post in object_list %}
        <div class="post-preview">
            <a href="{{ post.get_absolute_url }}">
                <h2 class="post-title">
                    {{ post.title }}
                </h2>
python django django-views django-urls
2个回答
2
投票

如果查看URL定义,可以看到它需要一个参数slug

re_path(r'post/(?P<slug>[-\w]+)/$', PostDetailView.as_view(), name='blog_post'),

顺便说一句,也可以表示为Django 2.0

path('post/<slug:slug>/', PostDetailView.as_view(), name='blog_post'),

现在,图像中的错误消息清楚地显示您在没有所述参数的情况下调用URL模板标记,它只有

href="{% url 'blog_post' %}"

并且没有slug参数存在。

你需要添加slug参数。

你甚至没有在你的问题中向我们展示正确的模板,其中出现的行显示在错误消息中,所以我不能比这更进一步。


0
投票

所以伙计们,我终于明白了。我的slu ur网址现在运作完美。

该错误实际上来自我的列表页面。细节视图的网址写得不好。我没有包含命名空间。因此,而不是<a href="{{ post.get_absolute_url }}">它变成<a href="{% url 'blog:blog_post' post.slug %}">我也删除了我的模型和我的视图页面中冗余的代码行。

这就是现在的样子。

models.朋友:

class Post(models.Model):
    STATUS_CHOICES = (
    ('draft', 'Draft'),
    ('published', 'Published'),
)

   title = models.CharField(max_length=200)
   slug = models.SlugField(max_length=200, default="")
   author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
   body = models.TextField()
   publish = models.DateTimeField(default=timezone.now)
   created = models.DateTimeField(auto_now_add=True)
   updated = models.DateTimeField(auto_now=True)
   status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')

   class Meta:
     ordering = ('-publish',)

   def __str__(self):
     return self.title

views.朋友

class BlogHomePageView(ListView):
   model = Post
   template_name = 'blog/index.html'
   context_object_name = 'posts'

class PostDetailView(DetailView):
    model = Post
    template_name = 'blog/post.html'
    context_object_name = 'post'

博客/ urls.py:

    urlpatterns = [
      path('', BlogHomePageView.as_view(), name='blog_home'),
      path('post/<slug:slug>/', PostDetailView.as_view(), name='blog_post'),
    ]

列表页面(index.html):

{% extends 'blog/base.html' %}

    {% block title %}Home{% endblock %}

    <!-- Page Header -->
    {% block page_header %}
        <div class="site-heading">
            <h1>Toluwalemi's Blog</h1>
            <span class="subheading">Official Blog</span>
        </div>
    {% endblock %}

    <!-- Main Content -->
    {% block content %}
        {% for post in posts %}
            <div class="post-preview">
                <a href="{% url 'blog:blog_post' post.slug %}">
                    <h2 class="post-title">
                        {{ post.title }}
                    </h2>
© www.soinside.com 2019 - 2024. All rights reserved.