我正在使用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'])
答案 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'
),
)