django在url模板标记中使用另一个字段而不是id

时间:2013-03-03 23:08:04

标签: django

我正在使用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.

我希望网址为/ 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'])

2 个答案:

答案 0 :(得分:2)

您要查看的内容之一是slugfield,它允许您拥有能够在网址中使用的数据。 Slugs只能包含字母,数字,下划线或连字符。从那里,您很可能希望覆盖模型的save方法来设置并确保slugfield是唯一的。然后,您可以将该字段用作网址的标识符。然后,您可以执行{% url 'blog:detail' slug=p.slug %}之类的操作,假设您将字段命名为slug。另外,正如另一个答案中所指出的,如果你使用它,你需要修改你的网址以寻找一个slu。而不是。

urlpatterns = patterns ('',

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

答案 1 :(得分:0)

如果您使用的是通用详细信息视图,则需要id或slug值。

但是,在您的URL conf中,您将命名变量指定为“title”。尝试将其更改为'slug':

urlpatterns = patterns ('',

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