2013-03-03 40 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