在Django 1.5中使用通用视图在模板中添加url参数

在Django 1.5中使用通用视图在模板中添加url参数,django,django-views,url-routing,django-1.5,Django,Django Views,Url Routing,Django 1.5,我正在学习Django,目前我正在一个项目中学习教程 现在我正试图转换为通用视图,这就是我遇到问题的地方: 新闻/模型.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) #r

我正在学习Django,目前我正在一个项目中学习教程

现在我正试图转换为通用视图,这就是我遇到问题的地方:

新闻/模型.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
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'),
[...]
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'),
[...]
新闻/url.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
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'),
[...]
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/templates/news/news.html

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

<h1 class="news">{{item.title}}</h1>
<p>{{ item.body_text }}</p>
[…]
{%用于allnews%中的项目}
[...]
{%endfor%}
现在我的问题是:我想使用
{%url'foo'ID%}
语法,使用ListView或DetailView等通用视图链接到特定的新闻项目(通过ID)。我怎样才能做到这一点?我为ListView声明了一个名称,但我无法确定如何指定
allnews.id

通过上面的代码,我得到了错误

带参数的“news_index”在/news/Reverse处的NoReverseMatch 找不到“(7L,)”和关键字参数“{}”


有趣的是,“7L”是最新新闻项目的id…

您使用了错误的详细信息视图。您定义了
news\u index
是一个
ListView
,您需要实现
DetailView
。有关django文档的更多信息,请参阅

url(r'^(?P<id>\d+)/$',
        DetailView.as_view(
            model=News,
            template_name='news/detail.html'),
        name='news_detail'),
url(r'^(?P\d+/$),
DetailView.as\u视图(
模型=新闻,
模板_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 %}
{%用于allnews%}
[...]
{%endfor%}

您应该有两个视图,一个用于列表,另一个用于详细信息,因此当您单击列表页面中的项目链接时,它将带您进入详细信息视图和模板:

新闻/url.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
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'),
[...]
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'),
[...]
从django.conf.url导入模式、url,包括
从django.views.generic导入详细视图,ListView
从新闻导入视图
从news.models导入新闻
urlpatterns=模式(“”,
url(r'^$',
ListView.as_视图(
queryset=News.objects.order_by('-post_date'),
上下文\u对象\u name='allnews',
模板_name='news/news.html'),
name='news_index'),
url(r'^(?P\d+/$),
DetailView.as\u视图(
模型=新闻,
上下文\u对象\u name='item',
模板_name='news/news\u item.html'),
name='news_detail'),
[...]
news/templates/news/news.html

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

<h1 class="news">{{item.title}}</h1>
<p>{{ item.body_text }}</p>
[…]
{%用于allnews%中的项目}
[...]
{%endfor%}
news/templates/news/news\u item.html

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

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

{{item.title}
{{item.body_text}


谢谢,但这不是我的意思:“^$”的URLconf应该引用一个将所有新闻显示为列表的视图。这个列表应该有指向实际新闻的html链接,如“/news/7”。这就是为什么我想使用列表视图来显示新闻“概述”和一条新闻的详细视图。这正好涵盖并解决了我的问题。非常感谢!