【问题标题】:Adding url parameters in template using generic views in Django 1.5在 Django 1.5 中使用通用视图在模板中添加 url 参数
【发布时间】:2013-03-02 15:54:45
【问题描述】:

我正在学习 Django,目前我正在按照Polls 教程松散地进行一个项目。

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

news/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

news/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/news.html

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

现在我的问题是:我想使用 {% url 'foo' id %} 语法使用通用视图(如 ListView详细视图。我怎样才能做到这一点?我为 ListView 声明了一个名称,但我不知道如何指定 allnews.id

使用上面的代码我得到错误

NoReverseMatch at /news/ Reverse for 'news_index' with arguments 未找到“(7L,)”和关键字参数“{}”。

有趣的是,“7L”是最新消息的id...

【问题讨论】:

    标签: django django-views url-routing django-1.5


    【解决方案1】:

    您使用了错误的视图来获取详细信息。你定义的news_index是一个ListView,你需要实现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 %}
    

    【讨论】:

    • 谢谢,但这不是我的意思:"^$" 的 URLconf 应该引用一个将所有新闻显示为列表的视图。这个列表应该有指向实际新闻的 html 链接,例如“/news/7”。这就是为什么我认为我会为新闻“概述”使用 ListView,而为单个新闻项目使用 DetailView。
    【解决方案2】:

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

    news/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/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>
    

    【讨论】:

    • 这完全涵盖并解决了我的问题。非常感谢!
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2013-03-07
    • 2018-11-03
    • 2016-04-26
    • 2013-08-14
    相关资源
    最近更新 更多