1

我正在使用 Django 1.5

我在 html 文件中有这段代码

{% for p in latest_posts %}
      <li><a href="{% url 'blog:detail' p.id %}">{{p.title}}</a></li>
{% endfor %}

如果我将 p.id 更改为 p.title

{% for p in latest_posts %}
      <li><a href="{% url 'blog:detail' p.title %}">{{p.title}}</a></li>
{% endfor %}

然后我收到以下错误

Reverse for 'detail' with arguments '(u'Second post',)' and keyword arguments '{}' not found.

我希望 url 是 /title 而不是 /id。

这是我的 urls.py 文件

urlpatterns = patterns ('',

    url(r'^(?P<title>\w+)/$',
            PostDetailView.as_view(),
            name = 'detail'
        ),
)

我应该只使用 get_absolute_url 吗?

更新

我添加了 slug 字段,但它仍然不起作用

{% url 'blog:detail' p.slug %}

我得到的错误是

Reverse for 'detail' with arguments '(u'third-post',)' and keyword arguments '{}' not found.

后模型

class Post(models.Model):
    title = models.CharField(max_length = 225)
    body = models.TextField()
    slug = models.SlugField()
    pub_date = models.DateTimeField()
    modified = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.title

管理员更新了

class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug" : ("title",)}


admin.site.register(Post, PostAdmin)

如果这有效

<a href="{% url 'blog:detail' p.id %}">{{p.title}}</a>

为什么这不起作用

<li><a href="{% url 'blog:detail' p.slug %}">{{p.title}}</a></li>

更新

PostDetailView

class PostDetailView(DetailView):

    template_name = 'blogapp/post/detail.html'

    def get_object(self):
        return get_object_or_404(Post, slug__iexact = self.kwargs['slug'])
4

2 回答 2

2

您将要研究的一件事是一个slugfield,它将允许您拥有能够在 url 中使用的数据。Slug 只能包含字母、数字、下划线或连字符。从那里您很可能希望覆盖模型的save方法来设置并确保 slugfield 是唯一的。然后,您可以使用该字段作为您的 url 的标识符。然后,您可以执行一些操作,例如{% url 'blog:detail' slug=p.slug %}假设您为该字段命名slug。此外,正如在另一个答案中指出的那样,如果您确实使用它,则需要修复您的 url 以查找 slug。

urlpatterns = patterns ('',

    url(r'^(?P<slug>[\w-]+)/$',
        PostDetailView.as_view(),
        name = 'detail'
    ),

)

于 2013-03-04T01:19:00.863 回答
0

如果您使用的是通用详细视图,它需要一个 id 或一个 slug 值。

但是,在您的 URL 配置中,您将命名变量指定为“标题”。尝试将其更改为“slug”:

urlpatterns = patterns ('',

    url(r'^(?P<slug>\w+)/$',
            PostDetailView.as_view(),
            name = 'detail'
        ),
)
于 2013-03-05T01:13:31.470 回答