2013-03-03 78 views
1

另一个领域,而不是ID我使用Django 1.5的Django在网址中使用模板标签

我有这个代码块在HTML文件

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

如果我改变p.id到页。标题

{% 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?

更新

我加了废料场,但它仍然无法正常工作

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

我得到的错误是

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

Post模型

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> 

更新

PostDetailVie w^

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

因此,您希望博客帖子的网址是'/ blog/second-post'而不是'/ blog/2'吗? – Ngenator 2013-03-04 00:51:29

+0

是的,我想要的网址是/博客/第二后 – iJK 2013-03-05 00:54:32

回答

2

一个你将要考虑的事情是slugfield,这将让你有一个能够在URL中使用的数据。 S can只能包含字母,数字,下划线或连字符。从那里你很可能会想要覆盖你的模型的save方法来设置并确保slugfield是唯一的。然后,您可以将该字段用作网址的标识符。然后,您可以执行类似{% url 'blog:detail' slug=p.slug %}的操作,前提是您将该字段命名为slug。另外,正如另一个答案中指出的那样,如果你确实使用了这个,你需要修正你的url来寻找一个slug。

urlpatterns = patterns ('', 

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

+0

我添加了slug字段到我的模型和更新admin.py包括在prepopulated_fields字典中的slu slu。我将网址模板标记更改为{%url'blog:detail'p.slug%},但它仍然无效。 – iJK 2013-03-05 00:58:45

+0

@iJK更新回答问题。 – Ngenator 2013-03-05 03:09:35

+0

我有我的网址不正确...它应该是网址(r'^ post /(?P \ d +)/(?P [\ w \ - ] +)/ $', – iJK 2013-03-09 16:36:19

0

如果您使用通用详细视图,它期望的ID或者是一个蛞蝓值。

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

urlpatterns = patterns ('', 

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

我仍然得到相同的错误在urls.py中用slu replacing替换标题后,我更新了显示PostDetailView的问题 – iJK 2013-03-05 01:37:54