我正在学习Django,目前我正在松散地遵循Polls教程。
现在我正在尝试转换为通用视图,这是我遇到问题的地方:
新闻/ 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 %}
语法使用{em> ListView 等通用视图链接到特定新闻项目(通过ID)或的DetailView 。我怎样才能做到这一点?我为ListView声明了一个名称,但我无法弄清楚如何指定allnews.id
。
使用上面的代码我得到错误
NoReverseMatch at / news / Reverse为'news_index'带参数 <(7L,)'和关键字参数“{}”未找到。
有趣的是,“7L”是最新新闻的ID ......
答案 0 :(得分:3)
您应该有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>
答案 1 :(得分:2)
您使用错误的视图了解详情。您定义的news_index
是ListView
,您需要实施DetailView
。在django docs中查看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 %}