2013-03-14 55 views
3

我正在學習Django,目前我在繼續教程Polls的教程中。在模板中使用Django 1.5中的通用視圖添加url參數

現在我想轉換成通用的觀點,這是在那裏我遇到了問題:

新聞/ models.py

[...] 
class News(models.Model): 
    id = models.IntegerField(primary_key=True, editable=False) 
    category = models.CharField(max_length=50L) 
    title = models.CharField(max_length=200L) 
    #rss_summary = models.CharField(max_length=2000L) 
    rss_summary = models.TextField(max_length=2000L) 
    #body_text = models.CharField(max_length=5000L) 
    body_text = models.TextField(max_length=5000L) 
    post_date = models.DateTimeField() 
    class Meta: 
     db_table = 'news' 
    def __unicode__(self): 
     return self.title 

新聞/ urls.py

from django.conf.urls import patterns, url, include 
from django.views.generic import DetailView, ListView 

from news import views 
from news.models import News 

urlpatterns = patterns('', 
    url(r'^$', 
     ListView.as_view(
      queryset=News.objects.order_by('-post_date'), 
      context_object_name='allnews', 
      template_name='news/news.html'), 
     name='news_index'), 
[...] 

新聞/模板/新聞/ news.html現在

[...] 
{% for item in allnews %} 
    <h1 class="news"><a href="{% url 'news_index' item.id %}">{{item.title}}</a></h1> 
    [...] 
{% endfor %} 

我的問題:我想用使用通用享有{% url 'foo' id %}語法鏈接到一個特定的新聞項目(通過ID),如的ListView的DetailView。我怎樣才能做到這一點?我爲ListView聲明瞭一個名稱,但我無法弄清楚如何指定allnews.id

有了上面的代碼,我得到的錯誤

NoReverseMatch在/新聞/反向與參數 'news_index' '(7L)' 和關鍵字參數 '{}' 未找到。

有趣的是,「7L」的最新消息是項目的ID ...

回答

2

你應該有2次,一個用於列表,另一個細節,因此,當您單擊列表頁的項目鏈接,它會您的詳細信息查看和模板:

新聞/ urls.py

from django.conf.urls import patterns, url, include 
from django.views.generic import DetailView, ListView 

from news import views 
from news.models import News 

urlpatterns = patterns('', 
    url(r'^$', 
     ListView.as_view(
      queryset=News.objects.order_by('-post_date'), 
      context_object_name='allnews', 
      template_name='news/news.html'), 
     name='news_index'), 

    url(r'^(?P<id>\d+)/$', 
     DetailView.as_view(
      model=News, 
      context_object_name='item', 
      template_name='news/news_item.html'), 
     name='news_detail'), 
[...] 

新聞/模板/新聞/ news.html

[...] 
{% for item in allnews %} 
    <h1 class="news"><a href="{% url 'news_detail' item.id %}">{{item.title}}</a></h1> 
    [...] 
{% endfor %} 

新聞/模板/新聞/ news_item.html

<a href="{% url 'news_index' %}">Back</a> 

<h1 class="news">{{item.title}}</h1> 
<p>{{ item.body_text }}</p> 
+0

這完全覆蓋並解決了我的問題。非常感謝! – weeheavy 2013-03-18 21:30:06

2

您正在使用細節上的錯誤觀點。您定義的news_indexListView,您需要執行DetailView。在django文檔中查看Urls in generic views的更多內容。

url(r'^(?P<id>\d+)/$', 
     DetailView.as_view(
      model=News, 
      template_name='news/detail.html'), 
     name='news_detail'), 

,然後在模板

{% for item in allnews %} 
    <h1 class="news"><a href="{% url 'news_detail' item.id %}">{{item.title}}</a></h1> 
    [...] 
{% endfor %} 
+1

謝謝,但是這不是我的意思:URL配置爲「^$「應該是指將所有新聞顯示爲列表的視圖。這個列表應該有html鏈接到像「/ news/7」這樣的實際新聞。這就是爲什麼我認爲我會爲新聞「概述」使用ListView,併爲單個新聞項目使用DetailView。 – weeheavy 2013-03-14 12:23:55

相關問題